链接:
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)
输出描述:
输出符合该方程要求的解数。
这个首先是可推得 通过推导大致可以得到 1/x+1/y=1/n nx+ny=xy 即 nx+ny-xy+n^2=n^2
即(n-x)(n-y)=n^2 即求n的因数 n 2是n的因数的两倍
当时在场上只推到这 但后来看了网上的题解发现后面的求因数还有诀窍就是所求数的因数中 素数
每一个素因子的数目+1)相乘所得
例如15的因子数目为1,3,5 ,15 (1+1)*(1+1)=4;
```
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
int t;
scanf("%d",&t);
while(t--) {
int n,ans=1,m,temp=0;
scanf("%d",&n);
m=(int)sqrt(n);
for(int i=2; i<=m; i++) {
if(n%i==0) {
while(n%i==0) {
n=n/i;
temp++;
}
ans=ans*(temp*2+1);
temp=0;
}
}
if(n>1) ans*=3;
printf("%d\n",ans/2+1);
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
int t;
scanf("%d",&t);
while(t--) {
int n,ans=1,m,temp=0;
scanf("%d",&n);
m=(int)sqrt(n);
for(int i=2; i<=m; i++) {
if(n%i==0) {
while(n%i==0) {
n=n/i;
temp++;
}
ans=ans*(temp*2+1);
temp=0;
}
}
if(n>1) ans*=3;
printf("%d\n",ans/2+1);
}
return 0;
}
```