題目連接:https://acm.ecnu.edu.cn/contest/196/problem/A/c++
題目:git
解題報告:算法
因爲必勝點是 n,因此 n 點的必勝狀態爲yes(走到這個點的人必勝),考慮 n-1 到 n/2+1 這一段(由於這一段都沒法整除),因此 i 點的狀態能夠由i+1獲得,接着從再從n/2推到1,因爲有兩種取法,因此對於當前狀態 i,若是 i+1或者 2*i 的狀態(這兩點的狀態前面已經推出來了),有一個爲yes,那麼這個 i 點的狀態就爲no(由於前面是由二者取最優的決策得出的),由於我走到這裏,另外一個玩家就能夠從這裏開始轉移到下一個他必勝的狀態。
ide
因此由前面的結論,將Cuber QQ Win贏的狀況的前10000項打表O(n)後,發現表中每一個偶數項都能被8整除,奇數項能經過前一個偶數項+2獲得。spa
打表代碼:code
1 #include<bits/stdc++.h> 2 #define numm ch-48 3 using namespace std; 4 template <typename T> 5 void read(T &res) { 6 bool flag=false;char ch; 7 while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true); 8 for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm); 9 flag&&(res=-res); 10 } 11 template <typename T> 12 void write(T x) { 13 if(x<0) putchar('-'),x=-x; 14 if(x>9) write(x/10); 15 putchar(x%10+'0'); 16 } 17 typedef pair<int,int> pi; 18 typedef long long ll; 19 const int maxn=10010; 20 int a[maxn]; 21 int main() 22 { 23 int n; 24 #define local 25 #ifdef local 26 freopen("1.txt","w",stdout); 27 #endif 28 29 #define p1 puts("Little Fang Win") 30 #define p2 puts("Cuber QQ Win") 31 for(int j=2;j<=10000;j++) { 32 n=j; 33 if(n==1) { 34 p1; 35 continue; 36 } 37 if(n%2) { 38 a[n]=1; 39 n--; 40 a[n]=0; 41 for(int i=n-1;i>n/2&&i>1;i--) 42 if((n-i)%2) a[i]=1; 43 else a[i]=0; 44 } 45 else { 46 a[n]=1; 47 for(int i=n-1;i>n/2&&i>1;i--) 48 if((n-i)%2) a[i]=0; 49 else a[i]=1; 50 51 } 52 for(int i=n/2;i>1;i--) 53 a[i]=max(a[i*2],a[i+1])?0:1; 54 if(a[2]) write(j),cout<<"->",p2; 55 } 56 return 0; 57 }
而後將偶數項除以8拿出來,發現有規律的(其實口述很差說),序列是1,4,5,16,17,20,21,64,65,68,69,80,81,84,85。規律就本身看了,而後用vector打表發現存不下,後來寫個算法把n往1推,發現4234這個數行不通,賽後看題解是有關二進制的,只要全部奇數位都爲0,那麼就是Cuber QQ Win,反之Little Fang Win,懵逼國有懵逼路,懵逼樹旁懵逼樹,懵逼樹下只有我...blog
AC代碼:get
1 #include<bits/stdc++.h> 2 #define numm ch-48 3 using namespace std; 4 template <typename T> 5 void read(T &res) { 6 bool flag=false;char ch; 7 while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true); 8 for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm); 9 flag&&(res=-res); 10 } 11 template <typename T> 12 void write(T x) { 13 if(x<0) putchar('-'),x=-x; 14 if(x>9) write(x/10); 15 putchar(x%10+'0'); 16 } 17 typedef long long ll; 18 #define p1 puts("Little Fang Win") 19 #define p2 puts("Cuber QQ Win") 20 int main() 21 { 22 int _; 23 ll n; 24 read(_); 25 while(_--) { 26 read(n); 27 bitset<64>b(n); 28 bool flag=false; 29 for(int i=0;i<63;i+=2) 30 if(b[i]) { 31 p1; 32 flag=true; 33 break; 34 } 35 if(!flag) p2; 36 } 37 return 0; 38 }