uva 1521 - GCD Guessing Game(贪心)

来源:互联网 发布:企业网络管理培训 编辑:程序博客网 时间:2024/06/05 16:51

题目链接:uva 1521 - GCD Guessing Game

题目大意:给定一个数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;}
2 0
原创粉丝点击