cf 1194 D1-2-K Game
Posted ysfac
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf 1194 D1-2-K Game相关的知识,希望对你有一定的参考价值。
(当时让这道sb题卡住了,我比sb还sb)
题意:
n个东西,两个人轮流取,每次可以取走1个,2个或k个,不能取的人输,求谁必胜。
$0leq n leq 10^{9},3leq k leq 10^{9}$
题解:
假如没有这个k,显然如果n是3的倍数则后手赢,否则先手赢。
操作方法就是某一个人永远保证$nequiv 0(mod 3)$
那么这个题的思考方式就是:
- 若$kequiv 0(mod 3)$,推一下SG函数,容易发现它有一个长度为(k+1)的循环节,于是mod(k+1)后按SG值判断即可。
- 否则,这个k的作用跟1或2一样,取不取k不影响必胜情况,按原来的方法判断即可。
代码:
#include<bits/stdc++.h> #define maxn 100005 #define maxm 500005 #define inf 0x7fffffff #define ll long long using namespace std; int N,K; inline int read(){ int x=0,f=1; char c=getchar(); for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘; return x*f; } int main(){ int T=read(); while(T--){ N=read(),K=read(); if(K%3==0) N%=(K+1); if((N+1)%3==1 && N!=K) printf("Bob "); else printf("Alice "); } return 0; }
以上是关于cf 1194 D1-2-K Game的主要内容,如果未能解决你的问题,请参考以下文章