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

本文介绍了一种计算可能越狱状态数的方法。通过快速幂计算总状态数与不可能越狱状态数之间的差值来得到可能越狱的状态数。具体算法包括状态总数计算、不可能越狱状态数计算及快速幂实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

分析

题目问的是可能越狱的状态数
状态数总的状态数-不可能越狱的状态数=可能越狱的状态数。
每个人可能信仰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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值