codechef LEMOVIE dp
生活随笔
收集整理的這篇文章主要介紹了
codechef LEMOVIE dp
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:
https://www.codechef.com/problems/LEMOVIE
對于這種類似排列,并且有大小關系的貢獻,一般要按從大到小或從小到大插入進行討論
一組數(shù)有貢獻當且僅當至少一個數(shù)被插到了最前面,那么就分情況進行討論即可
就是插板法,把y個數(shù)插到x個數(shù)當中,把x個數(shù)之間的空隙看成盒子
因為是排列,所以插完以后還要乘一下階乘
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<cmath> using namespace std; typedef long long ll;const int maxn = 210; const int mod = 1e9+7;int T,n,m,q; int a[maxn],b[maxn],c[maxn]; int f[maxn][maxn]; int C[1010][1010],jc[1010];bool cmp(int a,int b){return a>b; }ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f;}int main(){T=read();jc[0]=1;for(int i=1;i<=1000;i++) jc[i]=1ll*jc[i-1]*i%mod;C[0][0]=1;for(int i=1;i<=1000;i++){C[i][0]=C[i][i]=1;for(int j=1;j<i;j++){C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;}} while(T--){q=0;memset(f,0,sizeof(f)); n=read(),m=read();for(int i=1;i<=n;i++) a[i]=read();sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){if(a[i]!=a[i-1]){b[++q]=a[i];c[q]=1;}else{++c[q];}}f[0][0]=1; int cnt=0;for(int i=1;i<=q;i++){for(int j=1;j<=m;j++){f[i][j]=(1ll*f[i-1][j]*jc[c[i]]%mod*C[c[i]+cnt-1][cnt-1]%mod+1ll*f[i-1][j-1]*jc[c[i]]%mod*C[c[i]+cnt-1][cnt]%mod)%mod;}cnt+=c[i];}int ans=0;for(int i=1;i<=m;i++) ans=(ans+f[q][i])%mod;printf("%d\n",ans);}return 0; }?
轉載于:https://www.cnblogs.com/tuchen/p/10439705.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的codechef LEMOVIE dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 同步数据库仅在Worker内,目前只有C
- 下一篇: npm install 安装软件,出现