您的位置:首页 > 其它

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 F-等式

2018-03-30 08:36 399 查看
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给定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
;
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐