dtoj1825. 放棋子(chess)
Sol
因为每种颜色的棋子互补影响,我们考虑f[i][j][k]表示前i种颜色,放了j行k列的方案数。
假设求出g[i][j][k]表示i个棋子占据恰好j行k列的方案数。
那么有f[i+1][j+x][k+y]=f[i][j][k]*g[a[i+1]][x][y]*C(n-j,x)*C(m-k,y);
g的话我们用随便填的方案数C(x*y,i)-g[i][j][k]*C(x,i)*C(y,j)

#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #define ll long long #define mod 1000000009 using namespace std; int n,m,c,a[15],Max; ll f[15][35][35],g[956][35][35],C[935][935]; void init(){ int N=n*m; for(int i=0;i<=N;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; } for(int i=1;i<=Max;i++){ for(int x=1;x<=n;x++){ for(int y=1;y<=m;y++){ if(x*y<i||x>i||y>i)continue; ll tmp=C[x*y][i]; for(int j=1;j<=x;j++) for(int k=1;k<=y;k++){ if(j==x&&k==y)continue; tmp=(tmp-g[i][j][k]*C[x][j]%mod*C[y][k]%mod)%mod; } g[i][x][y]=tmp; } } } } int main(){ cin>>n>>m>>c; for(int i=1;i<=c;i++)scanf("%d",&a[i]),Max=max(Max,a[i]); init(); f[0][0][0]=1; for(int i=0;i<c;i++){ for(int j=0;j<=n;j++) for(int k=0;k<=m;k++){ if(!f[i][j][k])continue; for(int x=1;x+j<=n;x++) for(int y=1;y+k<=m;y++){ if(x*y>=a[i+1]) (f[i+1][x+j][y+k]+=1LL*f[i][j][k]*g[a[i+1]][x][y]%mod*C[n-j][x]%mod*C[m-k][y]%mod)%=mod; } } } ll ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)ans=(ans+f[c][i][j])%mod; ans=(ans+mod)%mod; cout<<ans<<endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构