[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 100003

using 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

 

 

posted @ 2016-09-10 16:37  without__sugar  阅读(131)  评论(0编辑  收藏  举报