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 }


浙公网安备 33010602011771号