HDU 1299 Diophantus of Alexandria

<del>
</del>
/ *1/x+1/y=1/n 

给你一个整数n,求x,y组合的个数(n<=10^9)

式中有x,y两个变量,通过转化可以可以转化为一个条件

假设y=n+m;则x的表达式为x=n*n/m+n;

这个条件就是if(n*n%m==0)
所以答案就是n*n的因子个数
显然一般方法直接会超时的
但是n的素因子很少 最大是sqrt(n);
每个数都可以表示成素因子之积
n=(prime[0]^ans[0])*((prime[1]^ans[1])*....
知道了每个素因子的个数,n的其他非素因子可以由素因子组合而来
 所以sum=(1+ans[0])*(1+ans[1])...//,这个类似母函数的组合形式,
1表示不用,我们只要他的系数

因为n*n=((prime[0]^(ans[0]*2))*((prime[1]^(ans[1]*2))*....
sum=(1+ans[0]*2)*(1+ans[1]*2)....*/

肯定要转化公式的,转化成一个条件,求未知的表达式
假设y=n+m;则x的表达式为x=n*n/m+n;
所以答案就是n*n的因子个数
显然直接会超时的
但是n的素因子很少最多有sqrt(n);
每个数都可以表示成素因子之积
n=(prime[0]^ans[0])*((prime[1]^ans[1])*....
知道了每个素因子的个数
1表示不用 所以sum=(1+ans[0])*(1+ans[1])...
因为n*n=((prime[0]^(ans[0]*2))*((prime[1]^(ans[1]*2))*....

sum=(1+ans[0]*2)*(1+ans[1]*2)....*/

#include<stdio.h>
#include<string.h>
#define ll __int64
#define N 330000//最大的素因子为sqrt(n)
bool used[N];
int prime[N];
int cnt;
void init()
{
    memset(used,false,sizeof(used));
    for(int i=2;i<N;i++)
    {
        if(!used[i])
        {
            prime[cnt++]=i; //筛选素因子
        for(int j=i;j<N;j+=i)
        {
            used[j]=true;
        }
        }
    }
}
int main()
{
    int T,k=1;
    cnt=0;
    init();
    scanf("%d",&T);
    while(T--)
    {
        ll n,sum=1;
        scanf("%I64d",&n);
        for(int i=0;i<cnt;i++)
        {
            ll ans=0;
            if(prime[i]>n)
                break;
            while(n%prime[i]==0)
            {
                ans++;
                n/=prime[i];
            }
            sum=(2*ans+1)*sum;
        }
        if(n>1)//n本身是素数的话
            sum*=3;

        printf("Scenario #%d:\n",k++);
        printf("%I64d\n\n",sum/2+1);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值