UvaLive 7040-Color
Posted DarkTong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UvaLive 7040-Color相关的知识,希望对你有一定的参考价值。
分析: 用容斥来求。
公式: C(m,k)*(k*(k-1)^(n-1) – C(k,k-1)*(k-1)*(k-2)^(n-1) + C(k,k-2)*(k-2)*(k-3)^(n-1)……. );
解释: C(m,k):m种颜色中选k种。k*(k-1)^(n-1): 至多有不超过k中颜色且相邻两种颜色不同的填法。
/* *********************************************** Author :DarkTong Created Time :2016/5/31 18:52:26 File Name :ff.cpp ************************************************ */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; typedef long long ll; const ll MOD = 1e9 + 7; const int maxn = 1000000 + 10; ll fac[maxn], Inv[maxn], Qui[maxn]; ll qui(ll x, ll n) { if(n==0) return 1; if(x==0) return 0; ll ans = 1; while(n) { if(n&1) ans=ans*x%MOD; x=x*x%MOD; n>>=1; } return ans; } ll inv(ll x) { return qui(x, MOD-2); } void init() { fac[0]=Inv[0]=1; for(int i=1;i<maxn;++i) { fac[i]=fac[i-1]*i%MOD; Inv[i]=inv(fac[i]); } } ll Cnm(ll n, ll m) { if(n<maxn) return fac[n]*inv(fac[n-m]*fac[m]%MOD)%MOD; ll a1 = 1, a2=1; for(ll i=n,j=1;j<=m;++j,--i) { a1=a1*i%MOD; a2=a2*j%MOD; } return a1*inv(a2)%MOD; } ll cnm(ll n, ll m) { // return fac[n]*(inv(fac[m])*inv(fac[n-m])%MOD)%MOD; return fac[n]*(Inv[m]*Inv[n-m]%MOD)%MOD; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); init(); int ca=1,tt; scanf("%d", &tt); while(ca<=tt) { ll n, m, k; scanf("%lld%lld%lld", &n, &m, &k); ll sum = k*qui(k-1, n-1)%MOD; for(int i=k-1,d=-1;i>=1;--i,d=-d) { ll s1 = (cnm(k, i)*i)%MOD*qui(i-1, n-1)%MOD; sum = ((sum+d*s1)%MOD+MOD)%MOD; } sum = sum*Cnm(m, k)%MOD; printf("Case #%d: %lld\n", ca++, sum); } return 0; }
以上是关于UvaLive 7040-Color的主要内容,如果未能解决你的问题,请参考以下文章
UVAlive-7040 color(组合数学,二项式反演)
UVALive 3971 Assemble(模拟 + 二分)
UVALive 4726 Average ——(斜率优化DP)