首页 > 代码库 > [HNOI2008]越狱

[HNOI2008]越狱

 

1008: [HNOI2008]越狱

时间限制: 1 Sec  内存限制: 162 MB
提交: 7706  解决: 3302

题目描述

  监狱有连续编号为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)

题解:

  每个人可能有M种信仰, 则状态共有M ^ N种, 若想所有人都不越狱, 第一个人有M种信仰选择, 剩下的人有M - 1种, 则不越狱的情况有M * (M - 1) ^ (N - 1), 则越狱的情况有M ^ N - [M * (M - 1) ^ (N - 1)]种。

  别忘记数据范围和时间, 快速幂和long long。

技术分享
#include <iostream>#include <cmath>#define ll long long#define mod 100003using namespace std;ll qpow(ll a, ll b){    ll ans = 1;    while( b )    {        if(b & 1) ans = ans * a % mod;        a = a * a % mod;        b >>= 1;    }    return ans % mod;}int main(){    int tot;    ll M, N;    cin >> M >> N;    tot = qpow(M, N) % mod - M * qpow(M - 1, N - 1) % mod;    if(tot < 0) tot = tot + mod;    cout << tot;    return 0;}
Sugar

 

 

[HNOI2008]越狱