快速幂(排列组合) - 越狱 - AcWing 1290
监狱有连续编号为 1 到 n 的 n 个房间,每个房间关押一个犯人。
有 m 种宗教,每个犯人可能信仰其中一种。
如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。
求有多少种状态可能发生越狱。
输入格式
共一行,包含两个整数 m 和 n。
输出格式
可能越狱的状态数,对 100003 取余。
数据范围
1 ≤ m ≤ 1 0 8 , 1 ≤ n ≤ 1 0 12 1≤m≤10^8, 1≤n≤10^{12} 1≤m≤108,1≤n≤1012
输入样例:
2 3
输出样例:
6
样例解释
所有可能的 6 种状态为:(000)(001)(011)(100)(110)(111)。
分析:
正 难 则 反 , 我 们 反 过 来 考 虑 。 正难则反,我们反过来考虑。 正难则反,我们反过来考虑。
每 个 房 间 都 有 m 种 情 况 , 根 据 乘 法 原 理 , 方 案 总 数 是 m n 。 每个房间都有m种情况,根据乘法原理,方案总数是m^n。 每个房间都有m种情况,根据乘法原理,方案总数是mn。
不 存 在 两 个 相 邻 的 方 案 总 数 是 : 不存在两个相邻的方案总数是: 不存在两个相邻的方案总数是:
第 一 间 有 m 种 情 况 , 第 二 件 有 m − 1 种 情 况 , 第 三 件 也 有 m − 1 种 情 况 , . . . , 方 案 总 数 是 m × ( m − 1 ) ( n − 1 ) 。 第一间有m种情况,第二件有m-1种情况,第三件也有m-1种情况,...,方案总数是m×(m-1)^{(n-1)}。 第一间有m种情况,第二件有m−1种情况,第三件也有m−1种情况,...,方案总数是m×(m−1)(n−1)。
最 终 结 果 : m n − m × ( m − 1 ) ( n − 1 ) , 注 意 取 模 防 止 出 现 负 数 。 最终结果:m^n-m×(m-1)^{(n-1)},注意取模防止出现负数。 最终结果:mn−m×(m−1)(n−1),注意取模防止出现负数。
代码:
#include<iostream>
#define ll long long
using namespace std;
const int mod=100003;
ll quick_pow(ll a,ll b,int mod)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
ll n,m;
cin>>m>>n;
ll ans=quick_pow(m,n,mod)-m*quick_pow(m-1,n-1,mod)%mod;
cout<<(ans+mod)%mod<<endl;
return 0;
}