20230803
数论
筛素数
素数的定义:只有1和它本身两个因数。
埃式筛
核心思想:如果一个数\(n\)能被\(\left ( 1,n \right )\)中的数整除,那么这个数就不是素数。
bool check(long long num) {
if (num == 1) {
return false;
}
for (long long i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
线性筛
核心思想:如果一个数\(n\)不是\(\left ( 1,n \right )\)中任意一个数的倍数,那么\(n\)为素数,所有n的倍数不是素数。
for (int i = 2; i < N; i++) {
if (visNum[i] == 0) {
primeCnt++;
prime[primeCnt] = i;
}
for (int j = 1; j <= primeCnt && prime[j] * i < N; j++) {
visNum[prime[j] * i] = true;
if (i % prime[j] == 0) {
break;
}
}
}
越狱
题目描述
监狱有 n 个房间,每个房间关押一个犯人,有 m 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。答案对 100,003 取模。
输入格式
输入只有一行两个整数,分别代表宗教数 m 和房间数 n。输出格式
输出一行一个整数代表答案。输入输出样例
输入2 3
输出
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% 的数据,保证1≤m≤108,1≤n≤1012。
所有可能性数量和两两相邻两个不同的数量相减,剩下的就是相邻两个相同的数量。第一个有\(m\)种选择,第二个人和第一个人不同,所以\(m-1\)种选择,第三个人和第二个人不同,但可以和第一个人相同,所以也有\(m-1\)种选择,以此类推,除第一个人外剩下\(n-1\)个人都有\(m-1\)种选择
#include <bits/stdc++.h>
using namespace std;
const int MOD = 100003;
long long f(long long a, long long b) {//快速幂
long long x = 1, y = a;
while (b >= 1) {
if (b % 2 == 1) {
x = x * y % MOD;
}
y = y * y % MOD;
b /= 2;
}
return x;
}
int main() {
long long n;
long long m;
cin >> m >> n;
cout << (f(m, n) - (m * f(m - 1, n - 1)) % MOD + MOD) % MOD;
return 0;
}