2117: gcd game (gcd)
阿新 • • 發佈:2018-12-20
題目描述
猜數遊戲,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; }