首页 > 代码库 > [HNOI2008]越狱

[HNOI2008]越狱

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
2 3
输出样例#1:
6

说明

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

简单到不像省选题,原本打算用半小时,结果只用了5分钟

所有状态m^n,不符合条件的状态:

第一个有m种选择,接下来n-1个为(m-1)种,所以总数:m*(m-1)^(n-1)

ans=m^n-m*(m-1)^(n-1)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int p=100003;
 7 long long ans1,ans2;
 8 long long qpow(long long x,long long m)
 9 {
10     if (m==0) return 1;
11     long long tmp=qpow(x,m/2);
12     tmp=(tmp*tmp)%p;
13     if (m%2==1) tmp=(tmp*x)%p;
14     return tmp;
15 }
16 int main()
17 {long long m,n;
18     cin>>m>>n;
19     ans1=qpow(m,n);
20     ans2=(m*qpow(m-1,n-1))%p;
21 cout<<(ans1-ans2+p)%p;
22 }

 

[HNOI2008]越狱