简单博弈

来源:互联网 发布:linux打包命令 zip 编辑:程序博客网 时间:2024/05/22 09:47
                      题目描述

  话说,小C经过上次被小T实力坑了一把以后呀,他就决定发明一个数字游戏来坑一坑小T!游戏规则是这样~

在游戏开始前,小C会任意的选出一个正整数n(1≤n≤2^32-1),同时令m=1。在玩的过程当中,小C和小T每个人都可以将m的值扩大2到9中的任意倍数(倍数一定是整数),两个人一人扩大一次,第一个使m≥n的人就是最后的赢家。

因为两个人都在互相算计,所以都是用的最佳策略,问最后是谁赢?

(上次因为吃了先手的亏,小C决定先手,也就是说:每次都是小C第一个玩)。

输入

多组输入(文件尾结束)

每行一个正整数n

输出

对于每个结果:

如果小C赢,则输出"C",

如果小T赢,则输出"T"。

(记得换行!!)

样例输入
9
样例输出
C

思路: 

如果先手可以到达终止局面,直接跳终止局面获得胜利 

否则,把对手推到必败局面,相当于获得胜利! 

思路很简单,关键在找必败局面: 

把问题稍微转换一下,便于找必败局面: 把m每次乘以2-9直到大于等于n -> 把n每次除以2-9(向上取整)直到n<=1为获胜; 

那么可以一次到达目标的必胜局区间是[1,9] ,第一个必败局面是(9,18],因为除9达不到1,除其他数对手必胜; 

同理可以一次到达(9-18]的必胜局的区间是(19,18*9] ,再推一个必败局(18*9,18*9*2],

再推一个必胜局[18*9*2+1,18*9*2*9] ,再推一个必败局(18*9*2*9,18*9*2*9*2]

必胜局:(18^n,18^n*9]...

 1 #include "cstdio" 2 #include "algorithm" 3 #include "cstring" 4 #include "cmath" 5 long long a[10],b[10]; 6 int main() 7 { 8     int n,cnt=0; 9     long long m,s;10     s=(long long )(pow(2,32)-1);11     a[0]=1,b[0]=9;12     for(int i=1;i<10;i++){13         m=(long long)(pow(18,i));14         if(m<=s){15             a[i]=m;16             b[i]=m*9;17             cnt++;18         }19     }20     while (scanf("%d",&n)==1){21         int k=0;22         for(int i=0;i<cnt;i++){23             if(a[i]<n&&n<=b[i]){24                 printf("C\n");25                 k=1;26                 break;27             }28         }29         if(!k){printf("T\n");}30     }31     return  0;32 }

 

 

0 0