uva 1521 - GCD Guessing Game(贪心)
2014-08-02 23:00
423 查看
题目链接:uva 1521 - GCD Guessing Game
题目大意:给定一个数N,现在又一个数x,在1~N之间,现在每次可以猜一个数a,返回gcd(x,a),问说最少猜几次可以确定x。
解题思路:其实就将1~N里面的素数都要考虑一遍,因为有一个N的限制,所以每次选出来的素数的积不大于N即可。因为最坏情况为所有素数都不包含,即都要猜一遍;否则若存在素数因子x,那么下次选择素数的范围即变为2~N/x之间,代价肯定更小。
题目大意:给定一个数N,现在又一个数x,在1~N之间,现在每次可以猜一个数a,返回gcd(x,a),问说最少猜几次可以确定x。
解题思路:其实就将1~N里面的素数都要考虑一遍,因为有一个N的限制,所以每次选出来的素数的积不大于N即可。因为最坏情况为所有素数都不包含,即都要猜一遍;否则若存在素数因子x,那么下次选择素数的范围即变为2~N/x之间,代价肯定更小。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10000; int N, v[maxn]; int npri, vis[maxn+5], prime[maxn+5]; void prime_table (int n) { npri = 0; for (int i = 2; i <= n; i++) { if (vis[i]) continue; prime[npri++] = i; for (int j = i * i; j <= n; j += i) vis[j] = 1; } } void set (int u, int x) { for (int i = x; i >= 0; i--) { int k = prime[i]; if (v[k] || k > u) continue; v[k] = 1; set(u/k, i-1); return; } } int solve () { int ans = 0; memset(v, 0, sizeof(v)); for (int i = npri-1; i >= 0; i--) { int u = prime[i]; if (v[u] || u > N) continue; ans++; v[u] = 1; set(N/u, i-1); } return ans; } int main () { prime_table(maxn); while (scanf("%d", &N) == 1) { printf("%d\n", solve()); } return 0; }
相关文章推荐
- UVA 题目1521 GCD Guessing Game(数论+贪心)
- UVA 1521 - GCD Guessing Game(数论+贪心)
- 【贪心】【poj 4028】GCD Guessing Game
- UVALive - 7715 The 2016 ACM-ICPC Asia Jakarta Regional Contest E - Guessing Game 繁琐的等差数列求和
- bzoj2632: [neerc2011]Gcd guessing game
- 2632: [neerc2011]Gcd guessing game
- UVALive - 7715 Guessing Game
- UVa 10530 - Guessing Game
- BZOJ2632 [neerc2011]Gcd guessing game
- UVA 1521 数论 + 贪心
- UVa 10905 Children's Game / 贪心
- LA 5916(GCD Guessing Game-质数分组)
- BZOJ2632: [neerc2011]Gcd guessing game
- BZOJ2632: [neerc2011]Gcd guessing game
- 【贪心】【堆】Gym -100956D - Greedy Game
- UVA 10400 Game Show Math (dfs + 记忆化搜索)
- UVA 11729 - Commando War(贪心)
- UVA 10148 Advertisement (贪心 + 区间选点问题)
- 【UVA 11426】 【求sum(gcd(i,j),1<=i<j<=n)1<n<4000001】
- uva 1346 - Songs(贪心)