hdu1215七夕节 筛素数+素因子分解+乘法公式

来源:互联网 发布:centos php5.6 lamp 编辑:程序博客网 时间:2024/05/01 00:39



/****************************8
这题暴力肯定要超时,换一种思路,把一个数变化成素因子相乘的形式
那么a=p1^e1*p2^e2...pn^en
所有除a以外的因子之和=(p1^0+p1^1+..p1^e1)*(p2^0+p2^1+...)...*(pn^0+pn^1+...pn^en)-p1^e1*p2^e2*...pn^en
然后就出来了。。。我摔,刚才发现p1^e1*p2^e2*...pn^en不需要求了直接就是a了= =
代码就这样吧
ps..之前图方便用pow函数,,结果就各种不对,后来百度才发现pow的参数类型= =好吧没见有int int的
*****************************/

七夕节

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24817    Accepted Submission(s): 7686


Problem Description
七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们的另一半是谁吗?那就按照告示上的方法去找吧!"
人们纷纷来到告示前,都想知道谁才是自己的另一半.告示如下:



数字N的因子就是所有比N小又能被N整除的所有正整数,如12的因子有1,2,3,4,6.
你想知道你的另一半吗?
 

Input
输入数据的第一行是一个数字T(1<=T<=500000),它表明测试数据的组数.然后是T组测试数据,每组测试数据只有一个数字N(1<=N<=500000).
 

Output
对于每组测试数据,请输出一个代表输入数据N的另一半的编号.
 

Sample Input
321020
 

Sample Output
1822
 
# include<stdio.h># include<math.h>const int maxn=500005;bool isPrime[maxn]={0};int prime[maxn/10], num=0;void getPrime(int n)  //筛素数,并把素数存到prime数组里{    int t;    for(int i=2; i<=n; i++)    {        if(isPrime[i]==0)        {            prime[num++] = i;            for(int j=2; (t=j*i)<=n; j++)              isPrime[t]=1;        }    }}int main(void){    getPrime(maxn-1);    int t,i,j,a, cnt, n, temp, p, k, tmp;    scanf("%d", &t);    while(t--)    {        n=0;        p=1;        k=1;        scanf("%d", &a);        for(i=0; ; i++)        {            temp=0;            cnt=0;            if(a==1)            break;            while(a%prime[i]==0)            {                temp=1;                a=a/prime[i];                cnt++;            }            if(temp)            {                tmp=1;                for(j=0; j<cnt; j++)                p*=prime[i];                for(j=0; j<=cnt; j++)                tmp*=prime[i];                k*=(tmp-1)/(prime[i]-1);            }        }        printf("%d\n", k-p);    }    return 0;}