bzoj4459[Jsoi2013]丢番图

bzoj4459[Jsoi2013]丢番图

题意:

丢番图方程: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

posted @ 2016-08-17 22:47  YuanZiming  阅读(266)  评论(0编辑  收藏  举报