其他分享
首页 > 其他分享> > P3197 [HNOI2008]越狱

P3197 [HNOI2008]越狱

作者:互联网

题目描述

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

输入输出格式

输入格式:

输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

输出格式:

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

输入输出样例

输入样例#1: 
2 3
输出样例#1: 
6

说明

6种状态为(000)(001)(011)(100)(110)(111)

 

Solution:

考虑到直接计算存在越狱情况很复杂(不要问为什么),而总的排列数为mn,于是想到用间接法。即会越狱的方案数=总的排列数-不会越狱的方案数。

而求不会越狱的方案数时,第一个位置有m种可能,而后面的n-1个位置都有m-1种可能(即必须满足同种宗教不相邻),由乘法原理得:不会越狱的方案数$=m*(m-1)^{n-1}$

那么就得出答案:$$ans=m^n-m*(m-1)^{n-1}$$

代码:

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,ans,t;
const int mod=100003;
inline ll fast(ll x,ll k)
{
    ll ans=1;
    while(k){
        if(k&1)ans=ans*x%mod;
        k>>=1,x=x*x%mod;
    }
    return ans;
}
int main()
{
    cin>>m>>n;
    printf("%lld",(mod+fast(m,n)-m*fast(m-1,n-1)%mod)%mod)    ;
    return 0;
}

 

 

 

 


标签:P3197,ll,样例,越狱,fast,ans,HNOI2008,mod
来源: https://blog.51cto.com/u_15180869/2873723