HYSBZ

来源:互联网 发布:用c语言写求整数绝对值 编辑:程序博客网 时间:2024/06/05 18:33

题目描述:
监狱有连续编号为1…N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

Input
  输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

Output
  可能越狱的状态数,模100003取余

Sample Input
2 3
Sample Output
6
Hint
  6种状态为(000)(001)(011)(100)(110)(111)

解题思路:

这主要是一道组合数学的题。要求相邻房间宗教相同的状态数。我们换一下思路,可以求出总的状态数,再减去房间相邻宗教不同的状态数,剩下的就是 答案。然后按照加法,减法,乘法的规则取模就可以了。

代码:

# include <cstdio># define ll long longusing namespace std;const ll mod = 100003; ll quick(ll a,ll b)  //快速幂取模{    ll ans = 1;    ll t = a % mod;    while(b)    {        if(b&1)        {            ans = ans * t % mod;        }        t = t * t % mod;        b >>= 1;    }    return ans;}int main(){    ll n,m;    scanf("%lld %lld",&m,&n);    ll ans = ((quick(m,n) % mod) - ((quick(m-1,n-1)%mod) * (m%mod)) % mod + mod) % mod;    printf("%lld\n",ans);    return 0;}
原创粉丝点击