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


链接:https://www.nowcoder.com/acm/contest/90/F
来源:牛客网

  • 1.题目描述
    给定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
  • 2.题目分析
    n=(xy)/(x+y)
    (x+y)n=xy
    x=n+a,y=n+b
    带入可以得到
    n2=ab
    题目就转化成了求所有整数对使得 ab=nn
    即求 n2 的约数个数,由于约数都是成对出现的,两数乘积为 n2 ,为奇数是因为 n n 成对出现,而只计算了1次。为避免重复,设约数个数为 p (p+1)/2 即为所求。
    然而 n2 过大不能直接求约数。我们用求质因子的方法求约数个数,只需求 n 的素因子,每个个数乘2即为 n2 的每个素因子个数。
  • 3.代码如下
#include<cstdio> 
#include<cstring> 
#include<algorithm> 
#include<iostream> 
#include<string> 
#include<vector> 
#include<stack> 
#include<bitset>
#include<cstdio> 
#include<cstdlib> 
#include<cmath> 
#include<set> 
#include<list> 
#include<deque> 
#include<map> 
#include<queue>
#include<algorithm> 
using namespace std; 
typedef long long ll; 
const double PI = acos(-1.0); 
const double eps = 1e-6; 
const int INF = 1000000000; 
const int maxn = 100; 
int gcd(int x,int y)
{       
     if(y==0) return x;
     return gcd(y,x%y);
}
int main()
{
    int T;
    scanf("%d",&T);//输入样例数目
    while(T--)
    {   
        int n;
        vector<int>vt;
        scanf("%d",&n);
        for(int i=1;i*i<=n;i++)
            if(n%i==0) 
            {   
                vt.push_back(i);
                if(i*i!=n) vt.push_back(n/i);
            }
        int l=vt.size();
        int num=0;
        for(int i=0;i<l;i++)
            for(int j=0;j<=i;j++)
                if(gcd(vt[i],vt[j])==1) num++;     
                    printf("%d\n",num);    
       }
    return 0;
}
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告