CF1739C Card Game
题意:有n(n为偶数)张大小不同的卡牌,现在A和B玩一个游戏,规则是如果一个人出示了一张卡牌,另一个人无法出示更大的卡牌,他就赢了,如果反之该回合结束,并将这两张牌移除(移入墓地bushi),由另一个人先出示卡牌,如果牌全部出示完了,那么就算平局,现在问如果最开始由A出示,分别有多少种发牌方式使得A赢,B赢以及平局。
Solution
组合数学,如果A赢,那么他必须拿到第一大的牌,或者每去掉四张牌的第一大和之前去掉的牌中最接近这张牌的(例如[1,2,3,4,5,6,7,8]中必须拿到8或者567或者467)
对于平局的情况,只有一种,B拿到第一大的牌,A拿到第二三大的牌,B拿到第四五大的牌,以此类推
剩下的情况就是B赢的

1 void init() 2 { 3 fac[0]=1; 4 for(int i=1;i<=60;i++) 5 { 6 fac[i]=(fac[i-1]*i)%mod; 7 } 8 inv[60]=ksm(fac[60],mod-2); 9 for(int i=59;i>=0;i--) 10 { 11 inv[i]=(inv[i+1]*(i+1))%mod; 12 } 13 } 14 15 int C(int n,int m) 16 { 17 if(n<m||n<0||m<0)return 0; 18 else return ((fac[n]*inv[n-m])%mod*inv[m])%mod; 19 } 20 21 22 void solve() 23 { 24 init(); 25 int n;cin>>n; 26 int cnt1=C(n-1,(n/2)-1); 27 int aa=n/2-2; 28 int cnt=1; 29 while(aa>0) 30 { 31 cnt1=((cnt1+C(n-4*cnt,aa-1))%mod+C(n-4*cnt-1,aa-1))%mod; 32 aa-=2; 33 cnt++; 34 } 35 int cnt2=((C(n,n/2)-cnt1)%mod-1)%mod; 36 cnt2=(cnt2+mod)%mod; 37 cout<<cnt1<<" "<<cnt2<<" "; 38 cout<<"1\n"; 39 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现