1. 程式人生 > >bzoj 1008 越獄

bzoj 1008 越獄

題意:有n個人排成一列,一共有m種勢力,每個人可能屬於一個勢力,相鄰的人勢力相同則不合法,一共有多少種可能的不合法狀態。

思路:所有的狀態是pow(m,n),正面很難求不合法的狀態,所以想到先求合法狀態,第一個人有m種選擇,剩下的人都只有m-1種選擇,所以答案就是pow(m,n)-m*pow(m-1,n-1),後面的式子做了乘法,所以要多取一次模,別忘了做了減法在加一次mod取模。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=100003;
ll m,n;
ll quick_pow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=(res*a)%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int main()
{
    while(~scanf("%lld %lld",&m,&n))
    {
        ll ans=(quick_pow(m,n)-(m*quick_pow(m-1,n-1))%mod+mod)%mod;
        printf("%lld\n",ans);
    }
}