hdu 1215 七夕节

参考博客:http://blog.csdn.net/niushuai666/article/details/7346408
收获:线性素数筛法、素数分解法
公式博客:http://www.cnblogs.com/baidongtan/archive/2012/08/30/2663015.html
还有关于素数筛法的三种比较:http://blog.csdn.net/sjf0115/article/details/8693756

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<string>
 5 #include<cmath>
 6 #include<algorithm>
 7 using namespace std;
 8 #define MAX 500000
 9 bool vis[MAX+5];
10 int prime[MAX+5];
11 void print_prime(){//线性求素数法
12     memset(vis,false,sizeof(vis));
13     int i,index=0;//注意初始化!!
14     int half=sqrt(MAX*1.0)+1;
15     for(i=2;i<half;i++){
16         if(!vis[i]){
17             prime[index++]=i;
18         }
19         for(int j=0;j<index&&prime[j]*i<=MAX;j++){
20             vis[prime[j]*i]=true;
21             if(i%prime[j]==0){
22                 break;
23             }
24         }
25     }
26 }
27 int work(int n){//素数分解
28     int i=0,total=1,temp=n;
29     for(;prime[i]*prime[i]<=n;i++){
30         int sum=1,num=1;
31         while(n%prime[i]==0){
32             num*=prime[i];
33             n/=prime[i];
34             sum+=num;
35         }
36         total*=sum;
37     }
38     if(n!=1){//可能剩下的落单的最大素数
39         total*=n+1;
40     }
41     return total-temp;
42 }
43 int main()
44 {
45     int t;
46     cin>>t;
47     print_prime();
48     //cout<<prime[0]<<endl;
49     while(t--){
50         int n;
51         cin>>n;
52         cout<<work(n)<<endl;
53     }
54     return 0;
55 }

 

posted @ 2015-02-03 10:48  Deribs4  阅读(139)  评论(0编辑  收藏  举报