bzoj 1008 越獄
阿新 • • 發佈:2018-12-15
題意:有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); } }