P2182 翻硬币
题目描述
小Z离开家的时候忘记带走了钱包,掉下的硬币在桌子上排成了一列。正在等着哥哥回来的小D坐在桌子旁边,无聊地翻着桌子上的硬币。
出于某种爱好,小D一次一定会同时翻转 M 枚硬币。由于小D是一个爱动脑的小学生,这样进行了若干次之后她很快想到了一个问题:有多少种方法能够在 K 次翻转后把硬币由原来的状态变成现在这样呢?
因为小D是个好学的小学生,她只需要你告诉她方案数对 1000000007 取模的值以方便她进行验算就可以了。
输入输出格式
输入格式:
第一行,包含三个字符 N,K,M ,表示硬币的数量,翻转的次数和每次翻转的硬币数量。
第 2~3 行,包含 N 个字母,表示硬币在一开始的状态和最终要变成的状态。1 表示正面而 0 表示背面。
输出格式:
一行包含一个整数,表示方案数对 1000000007 取模的值。
#include<bits/stdc++.h> using namespace std; int n,m,k,tot; int mod=1000000007; long long int c[1321][2132],f[2312][23123]; char a[300],b[300]; int work(){ cin>>n>>k>>m; scanf("%s%s",a+1,b+1); for(int i=1;i<=n;i++)if(a[i]!=b[i])tot++; return tot; } int main() { c[0][0]=1; for(int i=1;i<=100;i++){ c[i][0]=1; for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; } f[0][work()]=1; for(int t=1;t<=k;t++) for(int i=0;i<=n;i++) for(int j=0;j<=min(i,m);j++) { int ta=i-2*j+m; if(ta>=0&&ta<=n) f[t][ta]=(f[t][ta]%mod+f[t-1][i]*(c[n-i][m-j]*c[i][j]%mod)%mod)%mod; } cout<<f[k][0]; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥