传送门
思路还是不够清晰,搞了半天没搞出来。要多练练这种题呀!
给牌做个标记,max=1,max-1=2,max-2=3,max-3=4;
分三种情况:
- 如果先手拿到1,那无论如何先手都会赢,先手只要第一次就出1这张牌就好了
- 如果先手拿到2,3,4,这三张牌的话,无论先手先出2或者3或者4,后手都只能拿1来抵挡,先手接着出余下两张牌中的任意一张,后手都没有牌可以出了,先手获胜
- 先手拿到2,3,这两张牌,先手先出2,后手出1,此轮结束,后手出4,先手出3,此轮结束,这种状态就转化为一共有n-4张牌的状态
综上所述, c n − 1 n / 2 − 1 c_{n-1}^{n/2-1} cn−1n/2−1+ c n − 4 n / 2 − 3 c_{n-4}^{n/2-3} cn−4n/2−3+f[n-4]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
ll c[70][70],f[1000];
int main()
{
int t,n;
cin>>t;
for(int i=0; i<=60; i++)
for(int j=0; j<=60; j++)
if(!j)c[i][j]=1;
else if(i>0&&j>0)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
f[2]=1;
f[4]=3;
for(int i=6; i<=60; i++)
f[i]=((c[i-1][i/2-1]+c[i-4][i/2-3])+f[i-4])%mod;
while(t--)
{
cin>>n;
cout<<f[n]<<" "<<(c[n][n/2]-1-f[n]+mod)%mod<<" "<<"1"<<endl;
}
}