洛谷传送门
BZOJ传送门
题目描述
监狱有连续编号为 1…N 1 … N 的 N N 个房间,每个房间关押一个犯人,有 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
输入输出格式
输入格式:
输入两个整数 M,N M , N
输出格式:
可能越狱的状态数,模 100003 100003 取余
输入输出样例
输入样例#1:
2 3
输出样例#1:
6
说明
6种状态为(000)(001)(011)(100)(110)(111)
1≤M≤108
1
≤
M
≤
10
8
1≤N≤1012
1
≤
N
≤
10
12
解题分析
可能发生越狱的情况数不好算, 那就算不发生的情况数。
对于第一个房间, 我们有 M M 种放置的方式, 后面的房间因为与前一个不能相同, 所以都有种放置方式。
所以答案为 MN−M×(M−1)N−1 M N − M × ( M − 1 ) N − 1 。 写个快速幂就好了。
代码如下:
#include <cstdio>
#define R register
#define IN inline
#define ll long long
#define MOD 100003
IN ll fpow(ll now, ll tim)
{
ll ret = 1;
for (R int i = 0; i < 63; ++i, now = now * now % MOD)
if(tim & (1ll << i)) ret = ret * now % MOD;
return ret;
}
ll n, m;
int main(void)
{
scanf("%lld%lld", &m, &n); m %= MOD;
printf("%lld", ((fpow(m, n) - m * fpow(m - 1, n - 1)) % MOD + MOD) % MOD);
}