[HNOI2008]越狱 题解(容斥原理+快速幂)

[HNOI2008]越狱

Description

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

输入格式:输入两个整数M,N.1<=M<=108,1<=N<=1012

输出格式:可能越狱的状态数,模100003取余

Solution

1.直接计算所有的越狱方案不方便,考虑使用容斥原理分别计算总方案数和不越狱方案数,相减即可;

2.总方案数为 m^n,因为共有 n个房间,每个有 m个选择;

3.不会越狱的方案数为 m*(m-1)^(n-1),因为第一个房间有 m种选择,后面的每个都要和前面的不同,后面的每个都有 m-1个选择

4.因为要取模,所以不需要考虑使用高精,注意取模的细节。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;

ll n,m,ans,power1,power2;


ll qp(ll x,ll y){
    ll ans=1;
    while(y){
        if(y&1){ans=(ans*x)%100003;y^=1;}
        else{
            x=(x*x)%100003;
            y>>=1;
        }
    }
    return ans;
}

int main(){
    scanf("%lld %lld",&m,&n);
    power1=qp(m,n);
    power2=(m*qp(m-1,n-1))%100003;
    printf("%lld\n",(power1-power2+100003)%100003);
    return 0;
}
posted @ 2018-03-31 19:47  COLINGAO  阅读(809)  评论(0编辑  收藏  举报