一个模拟题,得在自己清醒的时候打...不然就会乱坟岗..
思路很简单,就是找到两个质数是不是差>(k+1),因为我们都足够聪明.那么,你下次肯定会取1(假设我是FFF),而我取k都到不了,那么我必输.其它肯定是我必胜,因为1,2,3你都不能取.所以这题就没了.但是,细节是真的多...具体看代码吧...码风还行..
#include <bits/stdc++.h> using namespace std; const int N=1e7+5; int prime[N],cnt=0; bool st[N]; void init() { for(int i=2;i<=N-5;i++) { if(!st[i]) {prime[cnt++]=i;} for(int j=0;prime[j]<=(N-5)/i;j++) { st[i*prime[j]]=true; if(i%prime[j]==0) { break; } } } } int main() { init(); bool flag=true; int n,k,pos,m=0; scanf("%d%d",&n,&k); if(n<=2) {puts("0");return 0;} for(int i=1;prime[i]<=n;i++) { m++; if(prime[i]-prime[i-1]>k+1) { flag=false; } } // cout<<prime[m]<<endl; if(n-prime[m]>k) {puts("0");return 0;} if(flag)//FFF可以赢 { // puts("9"); //FFF可以赢,那么每次选k的时候会尽量多选些质数. int wz,ans=0; while(1) { wz=n-k; int xb=lower_bound(prime,prime+m,wz)-prime; ans++; if(prime[xb]<=3) break; n=prime[xb]-1; ans++; } printf("%d\n",ans); } else//GGG可以赢 { // cout<<prime[pos]<<endl; int wz,ans=0;int cnt=m; if(n==prime[m]) { if(n-k<=prime[m-1]) cnt--; else {puts("0");return 0;} } while(1) { if(n-k<=prime[cnt]) { n=prime[cnt]; } else break; ans++; int xb=upper_bound(prime,prime+m,n-k)-prime; n=prime[xb]-1; cnt=xb-1; ans++; } if(ans) printf("%d\n",-ans); else puts("0"); } return 0; }