<del> </del>/*1/x+1/y=1/n
给你一个整数n,求x,y组合的个数(n<=10^9)
式中有x,y两个变量,通过转化可以可以转化为一个条件
假设y=n+m;则x的表达式为x=n*n/m+n;
这个条件就是if(n*n%m==0)
所以答案就是n*n的因子个数
显然一般方法直接会超时的
但是n的素因子很少 最大是sqrt(n);
每个数都可以表示成素因子之积
n=(prime[0]^ans[0])*((prime[1]^ans[1])*....
知道了每个素因子的个数,n的其他非素因子可以由素因子组合而来
所以sum=(1+ans[0])*(1+ans[1])...//,这个类似母函数的组合形式,1表示不用,我们只要他的系数
因为n*n=((prime[0]^(ans[0]*2))*((prime[1]^(ans[1]*2))*....
sum=(1+ans[0]*2)*(1+ans[1]*2)....*/
sum=(1+ans[0]*2)*(1+ans[1]*2)....*/
#include<stdio.h> #include<string.h> #define ll __int64 #define N 330000//最大的素因子为sqrt(n) bool used[N]; int prime[N]; int cnt; void init() { memset(used,false,sizeof(used)); for(int i=2;i<N;i++) { if(!used[i]) { prime[cnt++]=i; //筛选素因子 for(int j=i;j<N;j+=i) { used[j]=true; } } } } int main() { int T,k=1; cnt=0; init(); scanf("%d",&T); while(T--) { ll n,sum=1; scanf("%I64d",&n); for(int i=0;i<cnt;i++) { ll ans=0; if(prime[i]>n) break; while(n%prime[i]==0) { ans++; n/=prime[i]; } sum=(2*ans+1)*sum; } if(n>1)//n本身是素数的话 sum*=3; printf("Scenario #%d:\n",k++); printf("%I64d\n\n",sum/2+1); } return 0; }
HDU 1299 Diophantus of Alexandria
原文:http://blog.csdn.net/u012515742/article/details/44900561