【DP】Table(CF232B)
生活随笔
收集整理的這篇文章主要介紹了
【DP】Table(CF232B)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
luogu
CF232B
題目大意
給你一個(gè) n×mn\times mn×m 的網(wǎng)格,問你有多少種放點(diǎn)方案可以滿足每個(gè) n×nn\times nn×n 的網(wǎng)格內(nèi)都恰好有 kkk 個(gè)點(diǎn)
解題思路
不難發(fā)下,n×nn\times nn×n 的格子往下移一行,新的一行和剛過的一行點(diǎn)的數(shù)量一樣
那么設(shè) fi,jf_{i,j}fi,j? 表示前 iii 行放了 jjj 個(gè)點(diǎn)的方案數(shù),然后直接暴力轉(zhuǎn)移即可
code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 110 #define mod 1000000007 using namespace std; ll n,m,k,inv[N],fac[N],ifac[N],g[N][N],f[N][N*N]; ll C(ll x,ll y) {return fac[x]*ifac[x-y]%mod*ifac[y]%mod; } ll pw(ll x,ll y) {ll z=1;while(y){if(y&1)z=z*x%mod;x=x*x%mod;y>>=1;}return z; } void pre_work() {ifac[0]=fac[0]=inv[1]=ifac[1]=fac[1]=1;for(ll i=2;i<=n;++i){inv[i]=mod-mod/i*inv[mod%i]%mod;fac[i]=fac[i-1]*i%mod;ifac[i]=ifac[i-1]*inv[i]%mod;}for(ll i=1;i<=n;++i)for(ll j=0;j<=n;++j)g[i][j]=pw(C(n,j),(m-i+n)/n);//第i行選j個(gè)點(diǎn)的方案數(shù),冪為后面一樣的行return; } int main() {scanf("%lld%lld%lld",&n,&m,&k);pre_work();f[0][0]=1;for(ll i=1;i<=n;++i)for(ll j=0;j<=k;++j)for(ll l=0;l<=min(j,n);++l)(f[i][j]+=f[i-1][j-l]*g[i][l]%mod)%=mod;printf("%lld",f[n][k]);return 0; }總結(jié)
以上是生活随笔為你收集整理的【DP】Table(CF232B)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 索尼高管回应 PS Plus 会员涨价:
- 下一篇: 【随机】Ghd(CF364D)