监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
标签:display 第一个 hid return tput sam div desc long
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
输入两个整数M,N.1<=M<=10^8,1<=N<=10^12
可能越狱的状态数,模100003取余
6种状态为(000)(001)(011)(100)(110)(111)
这道题要我们求越狱的状态数,但是我们直接求有些困难,可以求出哪些不是越狱的状态,再用总状态数减去就可以了
那么不是越狱的状态有多少种呢?
就是第一个人可以有m种宗教信仰,第二个人有m-1种,第三个人也有m-1种,......,这样就有m*(m-1)^(n-1)种方案
而总方案数是m^n,所以越狱的状态就有m^n-m*(m-1)^(n-1)种
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define mod 100003 4 using namespace std; 5 ll n,m,x; 6 ll pow_mul(ll a,ll b){ 7 ll tmp=a,ans=1ll; 8 while (b>0){ 9 if (b%2) ans=ans*tmp%mod; 10 tmp=tmp*tmp%mod; 11 b>>=1; 12 } 13 return ans; 14 } 15 int main(){ 16 scanf("%lld%lld",&m,&n); 17 x=pow_mul(m,n)-m*pow_mul(m-1,n-1); 18 x=(x%mod+mod)%mod; 19 printf("%lld\n",x); 20 return 0; 21 }
标签:display 第一个 hid return tput sam div desc long
原文地址:http://www.cnblogs.com/zhuchenrui/p/7636509.html