【BZOJ】1008 越狱

来源:互联网 发布:剑三迪丽热巴捏脸数据 编辑:程序博客网 时间:2024/04/30 06:40

题目

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

1M108
1N1012

分析

发生越狱的情况数=总的情况数-不发生越狱的情况数。
总的情况数=MN,不发生越狱情况数=M×(M1)N1
所以Ans=MNM×(M1)N1,两次快速幂计算。

代码

#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;typedef long long LL;const int L=100003;LL n,m;LL mi(LL w,LL i){    if (i==0) return 1;    LL res=mi(w,i/2);    (res*=res)%=L;    if (i%2==1) (res*=w)%=L;    return res;}int main(void){        scanf("%lld%lld",&m,&n);    printf("%lld\n",((mi(m,n)-(m*mi(m-1,n-1))%L)%L+L)%L);    return 0;}

小结

计数问题最基本的转化就是用全集-补集

对于取模,注意两点:
①最后的输出为正数,要加上ans=(ans+M)modM转为正数
②运算中间小心超出int的情况,要强制转换成Lint运算,注意强制转化的部分的内部不要超出int

0 0