题目描述
给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)
输入描述:
在第一行输入一个正整数T。
接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。
(1<=n<=1e9)
输出描述:
输出符合该方程要求的解数。
示例1
输入
3
1
20180101
1000000000
输出
1
5
给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数)
输入描述:
在第一行输入一个正整数T。
接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。
(1<=n<=1e9)
输出描述:
输出符合该方程要求的解数。
示例1
输入
3
1
20180101
1000000000
输出
1
5
181
思路:
1/x+1/y=1/n,设x=n+a,y=n+b,化简可得n^2=a*b,
找出n^2的所有因子,根据数论中的唯一分解定理可得
任何整数n都可以表示为 n = p1^e1*p2^e2*..pn^en,
其中p1,p2…,pn都为素数,并且n的约数个数为(1+e1)*(1+e2)*…(1+en),
所以n^2 = (p1^e1*p2^e2…pn^en)^2 = (p1^2e1)*(p2^2e2)…*(pn^2en),所以因子个数为(1+2e1)*(1+2e2)*…(1+2en),所以可以利用唯一分解定理求出e1 e2…en,由于要满足x <= y所以只需找出a <= b的解的个数即可,设因子乘积为res,x<=y,所以res/2+1。
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
typedef long long ll;
int num[N];
int main()
{
int t;
cin>>t;
while(t--){
int n,cnt=0;
memset(num,0,sizeof(num));
cin>>n;
for(int i=2;i*i<=n;++i){
if(n%i==0){
while(n%i==0){
num[cnt]++;
n/=i;
}
cnt++;
}
}
if(n!=1){
num[cnt]++;
cnt++;
}
int res=1;
for(int i=0;i<cnt;++i)
res=res*(num[i]*2+1);
printf("%d\n",res/2+1);
}
}