1. 程式人生 > >2117: gcd game (gcd)

2117: gcd game (gcd)

題目描述

猜數遊戲,B 想一個在[1,N]中的值,每次A 猜一個[1,N]中的數,B 告訴A,B 所想的 數與A 猜的數的最大公約數的值。求A 最少猜幾次能猜到B 所想的數。N<=10000.

題解

如果告訴你的最大公約數為g,則相當於在[1,n/g]中猜數,所以在最壞情況下,得到的g都為1,即B猜的數為1。 所以我們可以把n以內的質數貪心分組,使得組數最小

#include <cstdio>
using namespace std;
int n,p[10005],t,A;bool F[10005];
int main(){
    scanf("%d",&n);
    for (int i=2;i<=n;i++){
        if (!F[i]) p[++t]=i;
        for (int j=1;j<=t && i*p[j]<=n;j++){
            F[i*p[j]]=1;
            if (i%p[j]==0) break;
        }
    }
    for (int i=1,j=t;i<=j;j--){
        A++;int s=p[j];
        while(i<j && s*p[i]<=n) s*=p[i++];
    }
    printf("%d\n",A);
    return 0;
}