越狱
【题目描述】
监狱里有连续编号为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,作差模数即可。 */