Matrix HDU - 6314(推式子好题)

题目大意:

Samwell·Tarly 正在学习绘制魔法矩阵,以保护自己免受白人步行者的伤害。
魔法矩阵是一个有 n 行和 m 列的矩阵,每个格子都应该涂成黑色或白色。
Sam想知道有多少种方法来绘制矩阵,满足于最终矩阵至少有 A 行和 B 列被绘制为完全黑色。因为答案可能太大,您只需要对 998244353 取模。

分析:

一道不错的推式子的好题。

首先,设 F[x][y] 为在大小为 x×y 的矩阵中,乱涂色,但保证每一行,每一列都不完全为黑色的数量。根据容斥原理,容易得到:

F[x][y]=i=0xj=0y(xi)(yj)(1)i+j2(ni)(mj)

假如我们求得了 F[x][y],那么答案 ans 就能很容易地求出来,即:

ans=i=Anj=Bm(ni)(mj)F[ni][mj]

然而直接求 F[x][y] 的时间复杂度为 O(n2m2),无疑是无法接受的,因此考虑将 F 的表达式代入,得到:

ans=i=Anj=Bmp=0niq=0mj(ni)(mj)(nip)(mjq)(1)p+q2(np)(mq)

移项,得:

ans=i=Anj=Bmp=0niq=0mj((1)p(ni)(nip))((mj)(mjq)(1)q)2(nip)(mjq)

t1=i+pt2=j+q,代入得:

ans=t1=Ant2=Bm2(nt1)(mt2)i=At1j=Bt2((1)t1i(ni)(nit1i))((mj)(mjt2j)(1)t2j)

即:

ans=t1=Ant2=Bm2(nt1)(mt2)i=At1((1)t1i(ni)(nit1i))j=Bt2((mj)(mjt2j)(1)t2j)

Fa[t]=i=At((1)ti(ni)(niti))Fb[t]=j=Bt((mj)(mjtj)(1)tj)

预处理时间复杂度分别为 O(n2)O(m2)

则有:

ans=t1=Ant2=Bm2(nt1)(mt2)Fa[t1]Fb[t2]

Code:

#include<algorithm> #include<cstring> using namespace std; const int MAXN = 3e3; const int MOD = 998244353; int fa[MAXN + 5],fb[MAXN + 5],dp[MAXN + 5][MAXN + 5],p[30000005],n,m,a,b; inline int qpow(int a,int m){ int ret = 1; while(m){ if(m % 2 == 1){ ret *= a % MOD; ret %= MOD; } m /= 2; a = a * a % MOD; } return ret; } void pre(){ p[0] = 1; for(int i = 1; i <= 3e6; i++){ p[i] = p[i - 1] * 2; p[i] %= MOD; } } signed main(){ dp[0][0] = 1; for(int i = 1;i <= MAXN; i++){ for(int j = 0; j <= i; j++){ if(j == 0 || j == i)dp[i][j] = 1; else dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]; } } pre(); while(scanf("%lld%lld%lld%lld",&n,&m,&a,&b) == 4){ memset(fa,0,sizeof fa); memset(fb,0,sizeof fb); for(int t = a; t <= n; t ++){ for(int i = a; i <= t; i++){ fa[t] += dp[n][i] * dp[n - i][t - i] * ((t - i) % 2 ? -1 : 1); } } for(int t = b; t <= m; t ++){ for(int i = b; i <= t; i ++){ fb[t] += dp[m][i] * dp[m - i][t - i] * ((t - i) % 2 ? -1 : 1); } } int ans = 0; for(int t1 = a; t1 <= n; t1++){ for(int t2 = b; t2 <= m; t2++){ ans += p[(n - t1) * (m - t2)] * (long long)(fa[t1] * fb[t2]) % MOD; ans %= MOD; } } cout << ans << "\n"; } }

__EOF__

本文作者Never Gonna Give You Up!
本文链接https://www.cnblogs.com/CZ-9/p/16587741.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   腾云今天首飞了吗  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示