【组合数学】[HNOI2008][HYSBZ/BZOJ1008]越狱

题目链接

分析

题目问的是可能越狱的状态数
状态数总的状态数-不可能越狱的状态数=可能越狱的状态数。
每个人可能信仰m种宗教的任何一种,所以一共有 mn 种状态
不可能越狱的状态:第i(i>1)个人不能和第i-1个人信仰一样的宗教, 所以只有m-1种选择,有 m(m1)n1 种状态

ans=mnm(m1)n1

用快速幂计算即可。

代码

#include<cstdio>
#define MOD 100003
int m;
long long n;
int quick_pow(int a,long long b){
    int ret=1;
    while(b){
        if(b&1)
            ret=1ll*ret*a%MOD;
        a=1ll*a*a%MOD;
        b>>=1;
    }
    return ret;
}
template<class T>
void Read(T &x){
    char c;
    while(c=getchar(),c!=EOF)
        if(c>='0'&&c<='9'){
            x=c-'0';
            while(c=getchar(),c>='0'&&c<='9')
                x=x*10+c-'0';
            ungetc(c,stdin);
            return;
        }
}
int main()
{
    Read(m),Read(n);
    printf("%lld",((quick_pow(m%MOD,n)-1ll*m%MOD*quick_pow((m-1)%MOD,n-1))%MOD+MOD)%MOD);
}

你可能感兴趣的:(C++,组合数学,bzoj,hnoi)