第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 F-等式
链接: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
输入
3
1
20180101
1000000000
输出
1
5
181
思路
1x+1yny+nx(n−x)(n−y)===1nxyn2
转化为求 n2 的因子 小于等于 n 的个数。
将 n 分解质因子,复杂度为 logn, n2 对应的质因子和 n 相同,且个数翻倍,即可得到 n2 的质因子个数。
根据数论中的唯一分解定理可得:
任何n=并且∴∴∴整数n都可以表示为:pe11∗pe22∗…∗penn,其中p1,p2,…,pn都为素数n的约数个数为(1+e1)∗(1+e2)∗…∗(1+en)n2=(pe11∗pe22∗…∗penn)2=(p2e11)∗(p2e22)∗…∗(p2enn)因子个数为(1+2e1)∗(1+2e2)∗…∗(1+2en)可以利用唯一分解定理求出e1,e2,…,en
设 n2 的因子个数为 ans, n2 的所有因子中除n外都是成对出现的,故方程解数为 (ans+1)/2。
AC代码
#include <iostream>
#include<cstring>
using namespace std;
int num[64];
int main() {
int T;
cin >> T;
while(T--) {
int n;
cin >> n;
memset(num, 0, sizeof(num));
int p=0;
for (int i=2; i*i<=n; i++) {
if(n%i==0) {
while (n%i == 0) {
num[p]++;
n /= i;
}
p++;
}
}
if(n!=1) {
num[p]++;
p++;
}
for(int i=0; i<p; i++) {
num[i]*=2;
}
int ans=1;
for (int i=0; i<p; i++) {
ans*=(num[i]+1);
}
cout << (ans+1)/2 << endl;
}
return 0;
}