HDU6143 Killer Names
HDU6143 Killer Names
思路:
简单组合数学
\[Ans=\sum_{i=1}^{m-1}\sum_{j=1}^{m-i}C[m][i]C[m-i][j]S[n][i]S[n][j]i!j!\\
意思为枚举在名和姓中的字母,\\然后把n个\mathbb{不同}空位分给i/j个\mathbb{不同}字母\\
显然不重不漏
\]
\(\mathfrak{Talk\ is\ cheap,show\ you\ the\ code.}\)
#include<map>
#include<cmath>
#include<stack>
#include<deque>
#include<queue>
#include<cstdio>
#include<vector>
#include<climits>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
# define Type template<typename T>
# define ll long long
# define read read1<ll>()
Type T read1(){
T t=0;char k;
bool v=0;
do (k=getchar())=='-'&&(v=1);while('0'>k||k>'9');
while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
return v?-t:t;
}
ll qkpow(ll n,ll x,ll mo){
if(!x)return 1;
ll t=qkpow(n,x>>1,mo);
t=t*t%mo;
if(x&1)t=t*n%mo;
return t;
}
# define mod 1000000007ll
# define N 2000
int S[N|3][N|1],fac[N|3],C[N|3][N|3];
int main(){
fac[0]=S[0][0]=1;
for(int i=1;i<=N;++i)S[i][i]=1,fac[i]=1ll*fac[i-1]*i%mod;
for(int i=0;i<=N;++i){
C[i][i]=C[i][0]=1;
for(int j=1;j<i;++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
for(int i=1;i<=N;++i)
for(int j=1;j<=i;++j)
S[i][j]=(S[i-1][j-1]+1ll*S[i-1][j]*j)%mod;
for(int T=read;T--;){
int n=read,m=read,ans=0;
for(int i=1;i<m;++i)
for(int j=1;i+j<=m;++j)
ans=(ans+1ll*C[m][i]*C[m-i][j]%mod*S[n][i]%mod*S[n][j]%mod*fac[i]%mod*fac[j])%mod;
printf("%lld\n",ans);
}
return 0;
}
因果乃旋转纺车,光彩之多面明镜
浮世苍茫,不过瞬逝幻梦
善恶爱诳,皆有定数
于命运之轮中
吞噬于黄泉之冥暗
呜呼,吾乃梦之戍人
幻恋之观者
唯于万华镜中,永世长存
浮世苍茫,不过瞬逝幻梦
善恶爱诳,皆有定数
于命运之轮中
吞噬于黄泉之冥暗
呜呼,吾乃梦之戍人
幻恋之观者
唯于万华镜中,永世长存

浙公网安备 33010602011771号