快速幂(排列组合) - 越狱 - AcWing 1290

快速幂(排列组合) - 越狱 - 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} 1m108,1n1012

输入样例:

2 3

输出样例:

6

样例解释

所有可能的 6 种状态为:(000)(001)(011)(100)(110)(111)。


分析:

正 难 则 反 , 我 们 反 过 来 考 虑 。 正难则反,我们反过来考虑。

每 个 房 间 都 有 m 种 情 况 , 根 据 乘 法 原 理 , 方 案 总 数 是 m n 。 每个房间都有m种情况,根据乘法原理,方案总数是m^n。 mmn

不 存 在 两 个 相 邻 的 方 案 总 数 是 : 不存在两个相邻的方案总数是:

第 一 间 有 m 种 情 况 , 第 二 件 有 m − 1 种 情 况 , 第 三 件 也 有 m − 1 种 情 况 , . . . , 方 案 总 数 是 m × ( m − 1 ) ( n − 1 ) 。 第一间有m种情况,第二件有m-1种情况,第三件也有m-1种情况,...,方案总数是m×(m-1)^{(n-1)}。 mm1m1...m×(m1)(n1)

最 终 结 果 : m n − m × ( m − 1 ) ( n − 1 ) , 注 意 取 模 防 止 出 现 负 数 。 最终结果:m^n-m×(m-1)^{(n-1)},注意取模防止出现负数。 mnm×(m1)(n1)

代码:

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值