题目链接:HDU 1299 传送门
题意:
求方程1/x+1/y=1/n的解的个数 1/3+1/2 与1/2+1/3看作是一组解。
分析:
1/x+1/y = 1/n 设y = n + k;
==>1/x + 1/(n+k)=1/n;
==>x = n^2/k + n;
因为x为整数,k就是n^2的约数。
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e7+10;
typedef long long LL;
int p[maxn/10],cnt;
bool vis[maxn];
int fac[1000],tot;
void init(){
cnt=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<maxn;i++){
if(!vis[i]){
p[cnt++]=i;
for(int j=i+i;j<maxn;j+=i) vis[j]=1;
}
}
}
LL get(LL x){
tot=0;
memset(fac,0,sizeof(fac));
for(int i=0;i<cnt&&p[i]*p[i]<=x;i++){
if(x%p[i]==0){
while(x%p[i]==0) fac[tot]++,x/=p[i];
tot++;
}
}
if(x>1) fac[tot++]=1;
LL ans = 1;
for(int i=0;i<tot;i++) ans=ans*(2*fac[i]+1);
return ans ;
}
int main()
{
init();
int t,cas=1;
scanf("%d",&t);
while(t--){
LL n;
scanf("%I64d",&n);
printf("Scenario #%d:\n%I64d\n\n",cas++,(get(n)+1)/2);
}
return 0;
}
题目链接:SPOJ - KPEQU 传送门
题意:
同上题差不多不过n换成了n!,因此需要用到高精度以及n!的素因子分解
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
static int cnt ;
static int[] pri =new int[10010];
static boolean[] vis = new boolean[10010];
public static void init(){
cnt=0;
for(int i=0;i<10010;i++) vis[i] = false;
for(int i=2;i<10010;i++){
if(!vis[i]){
pri[cnt++]=i;
for(int j=i+i;j<10010;j+=i) vis[j]=true;
}
}
}
public static int calc(int n,int p){
if(n<p) return 0;
else return calc(n/p,p)+n/p;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
init();
Scanner cin = new Scanner(System.in);
while(cin.hasNext()){
int n=cin.nextInt();
if(n==0) break;
BigInteger ans = BigInteger.ONE;
for(int i=0;i<cnt&&pri[i]<=n;i++){
int tmp = calc(n,pri[i]);
tmp = tmp*2+1;
ans=ans.multiply(BigInteger.valueOf(tmp));
}
System.out.println(ans);
}
}
}