【数学】U168701 “基本”数学问题

ORZZJY!

去年暑假,我被 JohnJoeZhu 的这道题吊打。

现在,我已经能一眼了()

好吧,事实上就是个二维二项式反演的板子。

容易发现 xy 列是啥没影响。

考虑设 f[i][j] 为至少有 i 行关键行 j 列关键列未染色的情况数。为什么不设为染色呢,因为难表示。g[i][j] 为恰好的。答案就是 g[0][0]

显然

f[i][j]=(xi)(yj)(nmtotk),tot=im+jnij

f[i][j]=a=ixb=jy(ai)(bj)g[a][b]

g[0][0]=i=0xj=0m(1)i+jf[i][j]

#include <bits/stdc++.h> #define int long long #define pb push_back using namespace std; int rd() { int f=1,sum=0; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) {sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();} return sum*f; } #define N 1005 #define M (int)(1e6+5) const int mod=998244353; int fpow(int x,int y) { int res=1; x%=mod; while(y) { if(y&1) res=res*x%mod; y>>=1; x=x*x%mod; } return res; } int f[N][N],jie[M],djie[M],n,m,x,y,k; int C(int n,int m) { if(m>n||m<0||n<0) return 0; return jie[n]*djie[m]%mod*djie[n-m]%mod; } signed main() { jie[0]=1; for(int i=1;i<=M-5;i++) jie[i]=jie[i-1]*i%mod; djie[M-5]=fpow(jie[M-5],mod-2); for(int i=M-5;i;i--) djie[i-1]=djie[i]*i%mod; n=rd(); m=rd(); k=rd(); x=rd(); y=rd(); for(int i=0;i<=x;i++) { for(int j=0;j<=y;j++) { int tot=i*m+j*n-i*j; f[i][j]=C(x,i)*C(y,j)%mod*C(n*m-tot,k)%mod; } } int ans=0; for(int i=0;i<=x;i++) { for(int j=0;j<=y;j++) { ans=(ans+(((i+j)&1)?-1:1)*f[i][j]%mod)%mod; } } ans=(ans%mod+mod)%mod; printf("%lld",ans); return 0; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/15872283.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示