给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)
在第一行输入一个正整数T。 接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。 (1<=n<=1e9)
输出符合该方程要求的解数。
对于任何一个自然数N,都可以分解质因子得到如下形式: N=(x1^a1)*(x2^a2)*(x3^a3)*...(xn^an); 那么,N的因子的个数为:f(n)=(1+a1)*(1+a2)*...(1+an); 如N=100,分解质因子变形为:100=2^2*5^2, N的因子的个数为:f(N)=f(100)=(1+2)*(1+2)=9。 即:1,2,4,5,10,20,25,50,100。 1/x+1/y=1/n 化简得(n-x)*(n-y)=n*n 由于n<=1e9,还是会超时, 但是这里可以加一步转换: n*n=(x1^a1)*(x2^a2)*...(xn^an)*(x1^a1)*(x2^a2)*...(xn^an); =[x1^(2*a1)]*[x2^(2*a2)]*...*[xn^(2*an)] 因此问题便得到了解决。 代码: #include<bits/stdc++.h> using namespace std; #define ll long long int main() { int T;scanf("%d",&T); while(T--) { ll n;scanf("%lld",&n); ll ans=1; for(ll i=2;i*i<=n;i++) { if(n%i==0) { ll t=1; while(n%i==0)n=n/i,t+=2;//模拟分解质数得过程。 ans*=t; } } if(n>1)ans*=3;//若最后还剩一个质数 printf("%lld\n",(ans+1)/2);//两个因子为一对 } return 0; }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。