首页 > 其他 > 详细

HDU 1299 Diophantus of Alexandria

时间:2015-04-06 12:55:42      阅读:122      评论:0      收藏:0      [点我收藏+]

<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;
}


HDU 1299 Diophantus of Alexandria

原文:http://blog.csdn.net/u012515742/article/details/44900561

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!