HDU 2204 Eddy's爱好(容斥原理)
生活随笔
收集整理的這篇文章主要介紹了
HDU 2204 Eddy's爱好(容斥原理)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2204
解題報告:輸入一個n讓你求出[1,n]范圍內有多少個數可以表示成形如m^k的樣子。
不詳細說了,自己一開始也忽略了三個素數的乘積的乘方的情況。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 typedef long long INT; 8 INT prim[70]; 9 10 int dabiao() 11 { 12 int f = 0; 13 for(int i = 2;i < 60;++i) 14 { 15 int flag = 1; 16 17 for(int j = 2;j < i;++j) 18 if(i % j == 0) 19 { 20 flag = 0; 21 break; 22 } 23 if(flag) prim[f++] = i; 24 } 25 return f; 26 } 27 28 int calc(INT a,INT b,INT n) 29 { 30 INT s = 1; 31 while(b--) 32 { 33 if((INT)(n / a) <= s) return 0; 34 s *= a; 35 } 36 return 1; 37 } 38 int main() 39 { 40 INT n; 41 int num = dabiao(); 42 while(scanf("%I64d",&n)!=EOF) 43 { 44 INT tot = 1; 45 for(int i = 0;i < num;++i) 46 { 47 INT temp = (INT)pow((double)n,1.0 / prim[i]); 48 if(temp == 1 ) break; //開方之后不足1的話,則退出 49 tot += temp - 1; //減1是因為每次都會統計到1 50 } 51 for(int i = 0;i < num;++i) 52 for(int j = i+1;j < num;++j) 53 { 54 INT temp = pow((double)n,1.0/(prim[i] * prim[j])); 55 if(temp == 1) break; 56 tot -= temp - 1; 57 } 58 for(int i = 0;i < num;++i) 59 for(int j = i + 1;j < num;++j) 60 for(int k = j + 1;k < num;++k) 61 { 62 INT temp = pow((double)n,1.0/(prim[i] * prim[j] * prim[k])); 63 if(temp == 1) break; 64 tot += temp - 1; 65 } 66 printf("%I64d\n",tot); 67 } 68 return 0; 69 } View Code?
轉載于:https://www.cnblogs.com/xiaxiaosheng/p/3870300.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的HDU 2204 Eddy's爱好(容斥原理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Atitit. 提升软件开发效率and
- 下一篇: 小白学jquery Mobile《构建跨