BZOJ1008 (HNOI2008)[越狱]--组合数学

该博客讨论了BZOJ1008题目,即HNOI2008的越狱问题。博主通过逆向思维,将原问题转化为求相邻房间犯人宗教相同的方案数,即总方案数减去相邻房间犯人宗教都不相同的方案数。总方案数为M^n,而相邻房间宗教不相同的情况为M*(M-1)^(n-1)。
摘要由CSDN通过智能技术生成

【链接】
bzoj1008

【题目大意】
给你n和M,n表示房间的数量,每个房间有一个犯人,m表示宗教的数量,求相邻房间之间有犯人的宗教相同的方案数。

【解题报告】
因为题目中叫我们求相邻房间之间有犯人的宗教相同的方案数,但是这样思考比较复杂。所以可以逆向思考,求相邻房间之间有犯人的宗教相同的方案数不就是求总方案数减去相邻房间之间犯人的宗教都不相同的方案数吗,这样问题就变简单了。总方案数就是 Mn ,相邻房间之间犯人的宗教都不相同的方案数也就是 M(M1)n1 (对于第一个犯人他可以信仰任意一个宗教也就是他可以信仰 M 种宗教,而第二个犯人因为不能信仰与一相同的宗教,所以他可以信仰M1种宗教,其他人也和第二个一样只能信仰 M1 种宗教)。

#include<cstdio>
#define LL long long
using namespace std;
const int tt=100003;
int m;
LL n;
inline LL Read()
{
    LL res=0;
    char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') res=res*10+ch-48,ch=getchar();
    return res;
}
LL Qsm(int a,LL b)
{
    LL w=a%tt,sum=1;
    while (b)
    {
        if (b&1) sum=sum*w%tt;
        w=(w*w)%tt; b>>=1;
    }
    return sum;
}
int main()
{
    freopen("1008.in","r",stdin);
    freopen("1008.out","w",stdout);
    m=Read(); n=Read();
    printf("%lld",(Qsm(m,n)-m%tt*Qsm(m-1,n-1)%tt+tt)%tt);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值