1. 程式人生 > >[BZOJ1008][HNOI2008]越獄 組合數學

[BZOJ1008][HNOI2008]越獄 組合數學

-m 合數 nbsp d+ mil 組合數 turn sca ans

正著直接算有點難,我們考慮反著來,用全集減補集。

總的方案數為$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 }

[BZOJ1008][HNOI2008]越獄 組合數學