越狱

// 越狱.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//


/*

http://ybt.ssoier.cn:8088/problem_show.php?pid=1618

https://loj.ac/p/10196

原题来自:HNOI 2008

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

【输入】
输入两个整数 m 和 n。

【输出】
可能越狱的状态数,对 100003 取余。

【输入样例】
2 3
【输出样例】
6
【提示】
样例说明

所有可能的 6 种状态为:{0,0,0},{0,0,1},{0,1,1},{1,0,0},{1,1,0},{1,1,1}。

数据范围与提示:

对于全部数据,1≤m≤108,1≤n≤1012 。
*/


#include <iostream>


using  namespace std;


long long m, n;
const int MOD = 100003;

long long fastmi(long long a, long long b, long long MOD) {
	long long res = 1;
	while (b) {
		if (b & 1) {
			res *= a;
			res %= MOD;
		}
		a *= a; a %= MOD;
		b >>= 1;
	}

	return res;
}


int main()
{
	cin >> m >> n;

	//m^n - m*((m-1)^(n-1))
	long long res = fastmi(m, n, MOD) - m * fastmi(m - 1, n - 1, MOD);
	res = (res % MOD + MOD) % MOD;

	cout << res << endl;
	return 0;
}

posted on 2025-03-18 12:12  itdef  阅读(7)  评论(0)    收藏  举报

导航