石家庄建设厅网站首页支付宝小程序开发费用
web/
2025/10/1 14:32:49/
文章来源:
石家庄建设厅网站首页,支付宝小程序开发费用,门户网站建设和检务公开整改,试客网站 源码有点难#x1f605;
考虑加入每一列#xff0c;发现我们只关心当前还未确定的行的数目
有点难算#x1f605;
设 d p i , j dp_{i,j} dpi,j表示有 i i i列#xff0c;其中 j j j行未确定的方案数。钦定每一列至少有一个黑色格子。 d p i , j j ( j 1 ) 2 d p i − 1…有点难
考虑加入每一列发现我们只关心当前还未确定的行的数目
有点难算
设 d p i , j dp_{i,j} dpi,j表示有 i i i列其中 j j j行未确定的方案数。钦定每一列至少有一个黑色格子。 d p i , j j ( j 1 ) 2 d p i − 1 , j ∑ k ≥ 1 ∑ k ≤ l ≤ j ( j − l 1 ) ( l k ) d p i − 1 , j − k dp_{i,j}\frac{j(j1)}{2}dp_{i-1,j}\sum_{k\ge 1}\sum_{k\le l\le j}(j-l1)\binom{l}{k}dp_{i-1,j-k} dpi,j2j(j1)dpi−1,j∑k≥1∑k≤l≤j(j−l1)(kl)dpi−1,j−k
暴力 D P DP DP的复杂度为 O ( N 3 M ) O(N^3M) O(N3M)考虑优化
发现可以看成从 j 2 j2 j2个数中选 k 2 k2 k2个数的方案数上面的式子其实是在枚举倒数第二个被选中的数的位置。 d p i , j j ( j 1 ) 2 d p i − 1 , j ∑ k j ( j 2 k ) d p i − 1 , k dp_{i,j}\frac{j(j1)}{2}dp_{i-1,j}\sum_{kj}\binom{j2}{k}dp_{i-1,k} dpi,j2j(j1)dpi−1,j∑kj(kj2)dpi−1,k
这样优化到了 O ( N 2 M ) O(N^2M) O(N2M)
将组合数拆成阶乘的形式可以用多项式优化。
复杂度 O ( N M log N ) O(NM\log N) O(NMlogN)。
#includebits/stdc.h
#define fi first
#define se second
#define ll long long
#define pb push_back
#define db double
#define inf 0x3f3f3f3f
using namespace std;
const int mod998244353;
const int N8005;
const int M205;
int n,m;
ll dp[N],res;
ll fac[N],inv[N];
ll fpow(ll x,ll ymod-2){ll z(1);for(;y;y1){if(y1)zz*x%mod;xx*x%mod;}return z;
}
void init(int n){fac[0]1;for(int i1;in;i)fac[i]fac[i-1]*i%mod;inv[n]fpow(fac[n]);for(int in;i1;i--)inv[i-1]inv[i]*i%mod;
}
ll binom(int x,int y){if(x0||y0||xy)return 0;return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
void add(ll x,ll y){x(xy)%mod;
}
int len;
ll invlen;
ll omega[N2][2];
void ntt(vectorlla,int len,int f0){int k0;while((1k)len)k;for(int i0;ilen;i){int t0;for(int j0;jk;j){if(ij1)t(1k-j-1);}if(it)swap(a[i],a[t]);}for(int l2;llen;l1){int kl/2;ll xomega[l][f];for(int i0;i!len;il){ll y1;for(int j0;jk;j){ll tmpa[ijk]*y%mod;a[ijk](a[ij]-tmp)%mod;a[ij](a[ij]tmp)%mod;yy*x%mod;}}}if(f)for(int i0;ilen;i)a[i]a[i]*invlen%mod;
}
struct poly{vectorlla;friend poly operator *(poly a,poly b){ntt(a.a,len),ntt(b.a,len);for(int i0;ilen;i)a.a[i]a.a[i]*b.a[i]%mod;ntt(a.a,len,1);return a;}
}f,g;
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cinnm,init(max(n,m)2);dp[0]1;len1;while(len2*(n2))len1;invlenfpow(len);omega[len][0]fpow(3,(mod-1)/len);omega[len][1]fpow(3,mod-1-(mod-1)/len);for(int ilen/2;i;i1){omega[i][0]omega[i1][0]*omega[i1][0]%mod;omega[i][1]omega[i1][1]*omega[i1][1]%mod;}g.a.resize(len);for(int i3;in2;i)g.a[i]inv[i];add(res,1);for(int i1;im;i){f.a.clear(),f.a.resize(len);for(int j0;jn;j)f.a[j]dp[j]*inv[j]%mod;ff*g;for(int j0;jn;j){dp[j](j*(j1)/2*dp[j]%modf.a[j2]*fac[j2])%mod;}for(int j0;jn;j)add(res,dp[j]*binom(n,j)%mod*binom(m,i));}cout(resmod)%mod;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85105.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!