hdu 1299 Diophantus of Alexandria

题意:输入n,问存在多少对(x,y),符合1/x+1/y=1/n,其中x<=y。

题解:变换下公式,得到y=(n*x)/(x-n),令a=x-n,则y=n*(n+a)/a=n*n/a+n。所以只要a是n^2的因子符合条件。直接计算n^2的因子数,必定超时。所以我们想到n的某个质因子个数为k,则n^2的质因子个数为2*k,这个很容易理解。而有个定理:一个数的因子数等于各个质因子个数+1的乘积。如24=2*2*2*3,因子数为(3+1)*(1+1)=8;这个忘了是什么定理的,反正一直在用就是了。。

若n的质因子个数分别为p1,p2,p3...,pk。则ans=(p1*2+1)*(p2*2+1)*...*(pk*2+1);

还要除去重复的。而必定存在一对x=y,使得方程成立;且x和y的顺序和结果无关(交换x和y结果不变)。所以答案就是ans/2+1。

耗时:171MS

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL __int64
int main()
{
    int T,tt=0;
    cin>>T;
    while(T--)
    {
        int n,ans=1,i,t=0,m;
        cin>>n;
        m=(int)sqrt(n+0.5);
        for(i=2;i<=m;i++)
        {
            if(n%i==0)
            {
                while(n%i==0){n=n/i;t++;}
                ans=ans*(t*2+1);
                t=0;
            }
        }
        if(n>1)
            ans*=3;
        cout<<"Scenario #"<<++tt<<":"<<endl;
        cout<<ans/2+1<<endl<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值