快速幂联系--越狱

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40924940/article/details/83796237

问题 D: 越狱

时间限制: 1 Sec  内存限制: 128 MB
提交: 34  解决: 12
[提交][状态][讨论版][命题人:quanxing]

题目描述

监狱有连续编号为 1 到 n 的 n 个房间,每个房间关押一个犯人。有 m 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。求有多少种状态可能发生越狱。

输入

输入两个整数 m 和 n。

对于全部数据,1≤m≤108,1≤n≤1012。

输出

可能越狱的状态数,对 100003 取余。

样例输入

2 3

样例输出

6

以上为题目,这题很有意思 需要反向思维,手 n 个囚房 m个信仰 一共有 m^n种情况对吧

如果避免相邻的一直 第一房子 有 m种选择,而相邻的第二个只有 m-1 种 防止重复,而第三个 还是 m-1种

不越狱的情况共有  m*(m-1)^(n-1) 

那么越狱情况 一相减就出来了。。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod = 100003;
#define ll long long int 
ll pow(ll x,ll n)
{
    ll ans=1;
    while(n)
    {
        if(n&1)
        {
            ans*=x;
            ans%=mod;
        }
        x*=x;
        x%=mod;
        n>>=1;
    }
    return ans;
}
ll n,m;
int main()
{
    cin>>m>>n;
    ll ans=(pow(m,n)%mod+mod-m*pow(m-1,n-1)%mod)%mod;//防止不足mod变成0 先加上一个Mod
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40924940/article/details/83796237