BZOJ2632 [neerc2011]Gcd guessing game

来源:互联网 发布:大数据的现状 编辑:程序博客网 时间:2024/06/05 17:34

题目描述有些问题,只要你心里知道那个数就行了

如果我们猜一个数,他告诉我们gcd不是1,那么相当于把n和你猜的数都除以gcd,他告诉你gcd是1。所以每次都告诉你是1是最坏的情况,这样当n以内的所有素数都作为询问的数的因数出现过,并且他告诉你gcd是1,从而n以内所有素数都被否认是答案的因数之后,我们就能确定答案是1

问题变成了我们要给n以内的素数分组,使得每组的乘积小于等于n,问最小组数

贪心,每次把当前最大的素数加入,然后从当前最小素数的开始加入直到不能再加

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<iomanip>#include<ctime>#include<vector>#include<stack>#include<set>#include<bitset>#include<map>#include<queue>using namespace std;#define MAXN 200010#define MAXM 10010#define MOD 1000000007#define INF 1000000000#define eps 1e-8#define ll long long int p[MAXM],tot;bool np[MAXM];int n;void su(){int i,j;for(i=2;i<=n;i++){if(!np[i]){p[++tot]=i;}for(j=1;j<=tot&&p[j]*i<MAXM;j++){np[p[j]*i]=1;if(!(i%p[j])){break;}}}}int main(){int i,x,y,z;scanf("%d",&n);su();int ans=0;int wzh=1;for(i=tot;i>=wzh;i--){int now=p[i];while(now*p[wzh]<=n){now*=p[wzh++];}ans++;}printf("%d\n",ans);return 0;}/**/


0 0