越狱

【题目描述】

监狱里有连续编号为1~N的N个房间,每个房间关押一个犯人,现有M种宗教,每个犯人可能信仰其中一种,如果相邻房间的犯人信仰的宗教相同,就可能发生越狱,询问有多少种情况可能发生越狱。

【输入描述】

输入两个整数M、N(1 <= M <= 108,1 <= N <= 1012)。

【输出描述】

输出一个数,表示可能越狱的情况数模100003的结果。

【样例输入】

2 3

【样例输出】

6

【数据范围及提示】

样例的6种可能越狱的情况为:000、001、011、100、110、111。

源代码:

#include<iostream>
#define INF 100003
using namespace std;
long long M,N;
int Count(long long X,long long Num)
{
    long long Ans=1;
    while (Num)
    {
        if (Num&1)
          Ans=(Ans*X)%INF;
        X=(X*X)%INF;
        Num>>=1;
    }
    return Ans;
}
int main() //大数据还得用cin,坑惨了。
{
    cin>>M>>N;
    cout<<(Count(M,N)+INF-(M*Count(M-1,N-1))%INF)%INF; //防止负数与溢出。
    return 0;
}

/*
    一道数学题。
    正向考虑情况数有点难搞,那就逆向,考虑不会越狱的情况数。
    1号房间可以有M个情况,2号房间就有(M-1)个情况,3号房间亦如是,以此类推得非越狱方案数为:M*(M-1)^(N-1)。
    总方案数为:M^N,作差模数即可。
*/
posted @ 2016-10-15 15:17  前前前世。  阅读(281)  评论(0编辑  收藏  举报