CF1739 C. Card Game
题目链接
题意简述
有这样一个游戏 , 有一摞编号为
两名玩家玩这个游戏,他们平均分这
每一个玩家的回合: 第一个玩家先出牌,然后下一个玩家出一张更强的牌. 如果一个玩家出牌后对手没有更大的牌,那么这个玩家就赢了. 一个玩家的回合结束后,轮到另一个玩家的回合. 如果某个回合结束后两个玩家都没有牌了,那么游戏平局.
给你牌的个数
样例
点击查看样例
分析
解法有很多,官方题解是
下面给出另一种解法(其实是没看懂官方题解)
注意,在一个玩家的回合结束后,另一个玩家的回合开始,这意味着: A打出牌后,B跟着打出,然后B再打出牌,A再跟着打出.
考虑
当
当
如果
下面只考虑
如果
如果
如果
如果
如果
如果
如果
综上所述:
当
平局的情况只有
当
代码
点击查看代码
#include<stdio.h>
#include<iostream>
using namespace std;
typedef long long LL;
int mod =998244353;
int n=10;
const int N = 70;
long long int c[N][N];//记录组合数.
long long int f[N];
int choose()
{
//从大佬那学来的求组合数的方法.
for(int i=0;i<=n;i++)
{
for(int j=0;j<=i;j++)
{
if(j==0)c[i][j]=1;
else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
}
}
f[2]=1;
for(int i=4;i<=n;i+=2)
{
f[i]=c[i-1][i/2]+c[i-4][i/2-1]+f[i-4];
f[i]%=mod;
}
printf("%lld %lld %lld\n",f[n],(c[n][n/2]-f[n]-1+mod)%mod,1LL);
return 0;
}
int main()
{
//freopen("uva.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
choose();
}
return 0;
}
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!