链接:
https://www.nowcoder.com/acm/contest/90/F
来源:牛客网
来源:牛客网
题目描述
给定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;
}