1521 - GCD Guessing Game

这个题目我在poj上交过了, uva 和 uvalive上始终交不过, 貌似至今还没有从uva和uvalive上交过得呢。

最难猜的数就是1了,由于答案可能是质数, 所以猜一个质数,就把他的倍数全都删掉,那么就把[1,n]中的质数分成最少的组,使得每组的乘积不超过n;

剩下的就是贪心了;

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 
 6 const int maxn = 10000 + 10;
 7 int n, plen, prime[maxn];
 8 bool vis[maxn];
 9 void mklist(int n) {
10     memset(vis, 0, sizeof(vis));
11     plen = 0;
12     for(int i = 2; i * i <= n; ++i) {
13         if(!vis[i]) {
14             for(int j = i; i * j <= n; ++j) {
15                 vis[i * j] = true;
16             }
17         }
18     }
19     for(int i = 2; i <= n; ++i) if(!vis[i]) prime[plen++] = i;
20 }
21 int main() {
22     while(cin >> n) {
23         mklist(n);
24         int ans = 0;
25         memset(vis, 0, sizeof(vis));
26         int i = 0, j = plen - 1;
27         while(i <= j)
28         {
29             int s = prime[j];
30             while(i <= j && s * prime[i] <= n) s *= prime[i++];
31             ++ans;
32             --j;
33         }
34         cout << ans << endl;
35     }
36     return 0;
37 }

 

posted @ 2013-01-29 22:46  ACSeed  Views(186)  Comments(0)    收藏  举报