问题 D: 越狱
作者:互联网
问题 D: 越狱
题目链接:http://acm.ocrosoft.com/problem.php?cid=1700&pid=3
题目描述
监狱有连续编号为 1 到 n 的 n 个房间,每个房间关押一个犯人。有 m 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。求有多少种状态可能发生越狱。
输入
输入两个整数 m 和 n。
对于全部数据,1≤m≤108,1≤n≤1012。
输出
可能越狱的状态数,对 100003 取余。
样例输入
2 3
样例输出
6
思路:总情况是m的n次对吧,不发生越狱就是相邻的不同,第一个有m种,后面的m-1种,总共是m乘上m-1的n次,然后做差就好了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 100003
ll quickpow(ll a, ll b, ll n)
{
if (b == 1)return a;
else
{
if (b % 2 == 0)
{
ll t = quickpow(a, b / 2, n);
return t * t%n;
}
else
{
ll t = quickpow(a, b / 2, n);
t = t * t%n;
t = t * a%n;
return t;
}
}
}
int main()
{
ll n, m;
cin >> m >> n;
cout << (quickpow(m, n, mod) % mod - (quickpow(m - 1, n - 1, mod)*m) % mod + mod) % mod;//总情况数-未成功越狱的情况数=越狱的情况数
}
标签:return,ll,越狱,问题,quickpow,犯人,define 来源: https://blog.csdn.net/qq_43330483/article/details/94611378