[HNOI2008]越狱 快速幂

来源:互联网 发布:大战神武将升阶数据 编辑:程序博客网 时间:2024/04/30 05:30

越狱

总时间限制: 10000ms单个测试点时间限制: 1000ms 内存限制: 262144kB描述    监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱输入    输入两个整数M,N.1<=M<=10^8,1<=N<=10^12输出    可能越狱的状态数,模100003取余样例输入2 3样例输出6提示6种状态为(000)(001)(011)(100)(110)(111)来源HNOI 2008这道题单想如何相邻很难想到,但如何不相邻就简单了,因为每次都只有m-1种情况,再拿总情况减不能越狱情况便可。总方案是m^n,不可能发生越狱的状态为m*(m-1)^(n-1),那答案就是m^n-m*(m-1)^(n-1)。用快速幂;
#include <cstdio>#include <iostream>using namespace std;typedef long long LL;#define HA 100003//膜 法 LL ans1;LL quick(LL x,LL n) {//快速幂    LL ans = 1;    while( n ) {        if( n & 1 ) ans = ans * x % HA;        x = x * x %HA;        n >>= 1;    }    return ans;}int main() {    LL m,n;    cin >> m >> n;    ans1 = quick( m, n ) % HA ;    ans1 -= quick( m-1, n-1 ) % HA * m;    ans1 = (ans1 % HA + HA ) % HA;    cout << ans1;    return 0;}
0 0