P3197 [HNOI2008] 越狱
题目描述
监狱有 nnn 个房间,每个房间关押一个犯人,有 mmm 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
答案对 100,003100,003100,003 取模。
输入格式
输入只有一行两个整数,分别代表宗教数 mmm 和房间数 nnn。
输出格式
输出一行一个整数代表答案。
输入输出样例 #1
输入 #1
2 3
输出 #1
6
说明/提示
样例输入输出 1 解释
| 状态编号 | 1 号房间 | 2 号房间 | 3 号房间 |
|---|---|---|---|
| 1 | 信仰 1 | 信仰 1 | 信仰 1 |
| 2 | 信仰 1 | 信仰 1 | 信仰 2 |
| 3 | 信仰 1 | 信仰 2 | 信仰 2 |
| 4 | 信仰 2 | 信仰 1 | 信仰 1 |
| 5 | 信仰 2 | 信仰 2 | 信仰 2 |
| 6 | 信仰 2 | 信仰 2 | 信仰 1 |
数据规模与约定
对于 100%100\%100% 的数据,保证 1≤m≤1081 \le m \le 10^81≤m≤108,1≤n≤10121 \le n \le 10^{12}1≤n≤1012。
C++实现
#include<cstdio>
#define ll long long
using namespace std;
const ll mod=100003ll;
inline int read(){
char ch=getchar();
int x=0,f=1;
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
inline ll pow(ll a){
return (a*a)%mod;
}
ll n,m;
inline ll qmi(ll a,ll b){
if(b==0)return 1;
return (b&1)?pow(qmi(a,b>>1))*(a%mod)%mod:pow(qmi(a,b>>1));
}
int main(){
scanf("%lld%lld",&m,&n);
ll ans=qmi(m,n)-(m%mod)*qmi(m-1,n-1)%mod;
while(ans<0)ans+=mod;
ans%=mod;
printf("%lld",ans);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
444

被折叠的 条评论
为什么被折叠?



