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

来源:互联网 发布:光环大数据怎么样 编辑:程序博客网 时间:2024/05/30 23:04

【链接】
bzoj1008

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

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

#include<cstdio>#define LL long longusing 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;}
原创粉丝点击