您的位置:首页 > 运维架构

BITACM 1050 Diophantus of Alexandria

2014-03-06 21:29 281 查看
题目大意:给定你一个n,问你有多少对x,y满足1/x+1/y=1/n。

首先,x,y>n。

我们设x=n+k(k>0)。

那么1/y=1/n-1/(n+k)=k/(n^2+k*n)

注意到y一定是整数,所以可以考虑把k除下来。

那么(n^2+k*n)/k一定是一个整数。

那么k|n^2。

k的个数一定是奇数个,考虑到x,y的大小问题。最后的答案应该是k的个数加1再除以2。

那么n^2的因子个数是多少个?

先考虑n的因数分解,由唯一分解定理,假设n=p1^k1*p2^k2*p3^k3....

那么n的因子个数就应该是(k1+1)*(k2+1)*(k3+1)*....(对于每个质因数我们都有ki+1种选法,由乘法原理可得)

附:假设x<=y,那么n+k<=(n^2+k*n)/k

化简:k^2+k*n<=n^2+k*n

再化简:k<=n。

#include "cstdio"
#include <cmath>
#define LL long long
int main(){
int kase=1;
int T;
LL ans;
LL n;
int cnt;
LL tem;
scanf("%d",&T);
while(T--){
scanf("%lld",&n);
ans=1;
tem=n;
for(int i=2;i<=sqrt(tem+0.5);i++){
if(n%i==0){
cnt=0;
while(n%i==0){
cnt++;
n/=i;
}
ans*=(2*cnt+1);
}
}
if(n!=1)  ans*=3;
printf("Scenario #%d:\n%lld\n\n",kase++,(ans+1)/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: