题意:
丢番图方程:1/x+1/y=1/n(x,y,n∈N+) ,给定n,求出关于n的丢番图方程有多少组解。n≤10^14。
题解:
通分得yn+xn=xy,即xy-xn-yn+n^2=n^2,即(x-n)(y-n)=n^2,故x-n是n^2的因数,所有答案为n^2的因数个数/2,向上取整。一个数的因数个数为该数每种质因数的个数+1的乘积。所以先将n分解质因数,然后ans乘上个数*2+1(因为要求n^2的因数个数)。如果最后n>1,说明有一个质因数大于sqrt(n),则ans还要乘3。最后输出(ans+1)/2即可。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 using namespace std; 6 7 long long n,ans; 8 int main(){ 9 scanf("%lld",&n); ans=1; 10 for(int i=2;(ll)i*i<=n;i++)if(n%i==0){ 11 int j=0; while(n%i==0)n/=i,j++; ans*=(j<<1|1); if(n==1)break; 12 } 13 if(n>1)ans*=3; 14 printf("%lld",(ans+1)>>1); return 0; 15 }
20160817