[BZOJ1008][HNOI2008]越狱 组合数学
http://www.lydsy.com/JudgeOnline/problem.php?id=1008
正着直接算有点难,我们考虑反着来,用全集减补集。
总的方案数为$m^n$。第一个人有$m$种可能,第二个人有$m-1$种可能,第三个人有$m-1$种可能……发现补集就是$m*(m-1)^{n-1}$。用快速幂搞搞就行了。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 const int mod=100003; 7 int quick_pow(int x,ll y){ 8 int base=x,sum=1; 9 while(y){ 10 if(y&1) sum=(ll)sum*base%mod; 11 base=(ll)base*base%mod; 12 y>>=1; 13 } 14 return sum; 15 } 16 int main(){ 17 ll n,m; 18 scanf("%lld%lld",&m,&n); 19 m%=mod; 20 printf("%d\n",(quick_pow(m,n)-m%mod*quick_pow(m-1,n-1)%mod+mod)%mod); 21 return 0; 22 }