首页 > 技术文章 > BZOJ 1008: [HNOI2008]越狱-快速幂/取模

ZERO- 2017-03-04 22:44 原文

1008: [HNOI2008]越狱

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 8689  Solved: 3748

Description

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

Input

  输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

Output

  可能越狱的状态数,模100003取余

Sample Input

2 3

Sample Output

6

HINT

 

6种状态为(000)(001)(011)(100)(110)(111)

这个题就是快速幂和取模:
可能越狱的状态数=总的状态数-不可能越狱的状态数。
不可能的情况就是:
第一个人m种情况,第二个人m-1种情况,第三个人m-1种情况,依次类推。
所以有如下代码:
#include<bits/stdc++.h>
typedef unsigned long long ull;
using namespace std;
ull n=1e5+3;
ull pow(ull a,ull b){
    ull ans=1;
    while(b!=0){
        if(b%2==1)
            ans=ans*a%n;
            a=a*a%n;
            b=b/2;
    }
    return ans;
}
int main(){
    ull a,b;
    while(~scanf("%llu%llu",&a,&b)){
            ull h=pow(a,b);
            ull k=pow(a-1,b-1);
            ull ans=(h+n-a*k%n)%n;
            printf("%llu\n",ans);
    }
    return 0;
}

 

 

 

推荐阅读