UVa Live 7040 (二项式反演+线性求逆元)
2017-08-20 21:01
387 查看
题目链接
思路:先考虑只有k的请况,设f[i]为出现i种颜色的种数
k⋅(k−1)n−1=∑i≤kC(k,i)⋅f(i)
套二项式反演即可
思路:先考虑只有k的请况,设f[i]为出现i种颜色的种数
k⋅(k−1)n−1=∑i≤kC(k,i)⋅f(i)
套二项式反演即可
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int MOD=1e9+7,N=1e6+10; typedef long long ll; int n,m,k,T,kase=0; ll inv ,Ck ,Cm ; void calinverse() { inv[1]=1; for(int i=2;i<N;i++) inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD; } void getC() { Ck[0]=Cm[0]=1; fo(i,1,k) {Ck[i]=Ck[i-1]%MOD*(k-i+1)%MOD*inv[i]%MOD; Cm[i]=Cm[i-1]%MOD*(m-i+1)%MOD*inv[i]%MOD;} } ll qpow(ll a,int b) { ll ret=1; for(int i=b;i;i>>=1,a=a*a%MOD) if(i&1) ret=ret*a%MOD; return ret; } int main() { calinverse(); scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); int sgn=1; ll sum=0; getC(); for(int i=k;i>=1;i--){ sum=(sum+Ck[i]*i%MOD*qpow(i-1,n-1)*sgn%MOD+MOD)%MOD; sgn=-sgn; } sum=(sum*Cm[k])%MOD; printf("Case #%d: %lld\n",++kase,sum); } return 0; }
相关文章推荐
- UVALive 7040 Color (容斥原理 + 组合数学递推公式 + 求逆元 + 基础数论)
- UVALive 7040 Color (容斥原理 + 组合数学递推公式 + 求逆元 + 基础数论)
- UVALive 7040 Color (容斥定理 + 递推求逆元 + 组合数 + 快速幂)
- UVAlive7040(组合数,容斥原理,逆元)
- Color UVALive - 7040 (容斥+组合数)
- UVALive 7040
- UVALive 7040 (容斥)
- UVALive - 7040 Color 【容斥定理】
- UVALive 7040 Color
- 【容斥原理+逆元+组合数+费马小定理+快速幂】UVALive - 7040 Color
- [组合数]UVALive7040
- 组合数+容斥原理 UVALive 7040 Color(14西安F)
- UVALive 7040 color(容斥原理)
- UVALive 7040 Color (容斥原理+逆元+组合数+费马小定理+快速幂)
- UVALive 7040 Color 容斥原理 + 组合数学递推公式 +lucas
- ( UVALive 7720)J - Super Sum(逆元+扩展欧几里得/费马小定理)(补)
- uvalive7040/cf gym 100548 Color(2014西安区域赛F题)
- uvaLive 3222 Joke with Turtles 带权区间调度、覆盖问题 等价转换+线性动归
- uva live 4731 Cellular Network 线性dp
- 2-SAT入门——UVALive - 3211