题目链接:uva 1521 - GCD Guessing Game
题目大意:给定一个数N,现在又一个数x,在1~N之间,现在每次可以猜一个数a,返回gcd(x,a),问说最少猜几次可以确定x。
解题思路:其实就将1~N里面的素数都要考虑一遍,因为有一个N的限制,所以每次选出来的素数的积不大于N即可。
#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(贪心),布布扣,bubuko.com
时间: 2024-10-20 07:45:04