[HNOI2008]越獄 -- 組合數學(我學的很弱的部分)

題目描述
監獄有連續編號爲 1…N 的 N 個房間,每個房間關押一個犯人,有 M 種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄

輸入格式
輸入兩個整數 M,N

輸出格式
可能越獄的狀態數,模 100003 取餘

  1. 一看就是組合數學
  2. 聽說要用逆向思維,直接計算不好做
  3. 用所有情況數-相鄰不同的情況數 => m^n - m*(m-1)^(n-1)
#include <bits/stdc++.h>
#define re register
#define il inline
using namespace std;
typedef long long ll;
const ll mod = 100003;
ll n, m;
ll mpow(ll a, ll b, ll mod) {
    ll res = 1;
    for(; b; b >>= 1, a=a*a%mod) 
		if(b&1) res = res*a%mod;
    return res;
}
int main() {
    scanf("%lld%lld",&m,&n);
    printf( "%lld", ((mpow(m,n,mod)-m*mpow(m-1,n-1,mod))%mod+mod)%mod);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章