题目描述
话说,小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 }
时间: 2024-10-25 19:45:50