算法刷题day38:快速幂

目录

引言

本篇文章主要介绍了快速幂,虽然我觉得自己已经掌握了,可是做起题来还是很生疏,尤其是做自己之前已经做过的题目,而且之前写的一个快速幂公式也有点问题,也给纠正了,所以还是要写写之前做过的有些难度并且已经生疏的题目啊,不然真的不做,跟没做一样,但是再做一遍就不一样了,比之前更清晰更深刻了些,加油!


一、转圈游戏

标签:快速幂

思路:公式如下: a n s = ( x + 1 0 k ∗ m ) m o d n ans = (x + 10^k * m)\ mod\ n ans=(x+10k∗m) mod n

因为相当于走了 1 0 k ∗ m 10^k * m 10k∗m 步,每走一步位置加一,再加上之前的相对位置,再取模即可。

题目描述:

复制代码
n 个小伙伴(编号从 0 到 n−1)围坐一圈玩游戏。

按照顺时针方向给 n 个位置编号,从 0 到 n−1。

最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,...,依此类推。 

游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号置,...,依此类推,
第 n−m 号位置上的小伙伴走到第 0 号位置,第 n−m+1 号位置上的小伙伴走到第 1 号位置,...,第 n−1 号位置上的小伙伴顺
时针走到第 m−1 号位置。

现在,一共进行了 10k 轮,请问 x 号小伙伴最后走到了第几号位置。

输入格式
输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。

输出格式
输出共 1 行,包含 1 个整数,表示 10k 轮后 x 号小伙伴所在的位置编号。

数据范围
1<n<106,0<m<n,1≤x≤n,0<k<109
输入样例:
10 3 4 5
输出样例:
5

示例代码:

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e6+10;

int n, m, k, x;

LL qmi(LL a, LL k, int p)
{
	LL res = 1;
	while(k)
	{
		if(k&1) res = res * a % p;
		k >>= 1;
		a = a * a % p;
	}
	return res;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n >> m >> k >> x;
	
//	x + 10^k * m
	
	cout << (x + qmi(10,k,n) * (LL)m) % n << endl;
	
	return 0;
}

二、快速幂

标签:数学知识、快速幂

思路:模板题没什么说的

题目描述:

复制代码
给定 n 组 ai,bi,pi,对于每组数据,求出 abiimodpi 的值。

输入格式
第一行包含整数 n。

接下来 n 行,每行包含三个整数 ai,bi,pi。

输出格式
对于每组数据,输出一个结果,表示 abiimodpi 的值。

每个结果占一行。

数据范围
1≤n≤100000,1≤ai,bi,pi≤2×109
输入样例:
2
3 2 5
4 3 9
输出样例:
4
1

示例代码:

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10;

int n, m;

LL qmi(LL a, LL k, int p)
{
	LL res = 1;
	while(k)
	{
		if(k&1) res = res * a % p;
		k >>= 1;
		a = a * a % p;
	}
	return res;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n;
	while(n--)
	{
		int a, k, p; cin >> a >> k >> p;
		cout << qmi(a,k,p) << endl;
	}
	
	return 0;
}

三、互质数的个数

标签:数论、欧拉函数、快速幂

思路:这个其实就是套公式了,欧拉函数的定义就是在 1 ∼ N 1 \sim N 1∼N 中与 N N N 互质的个数,公式如下: ϕ ( N ) = N ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) \phi(N) = N \cdot\ (1- \frac{1}{p_1})\ \cdot (1-\frac{1}{p_2})\ \cdots (1-\frac{1}{p_k}) ϕ(N)=N⋅ (1−p11) ⋅(1−p21) ⋯(1−pk1) ϕ ( a b ) = a b − 1 ⋅ a ⋅ ( 1 − 1 p 1 ) ⋅ ( 1 − 1 p 2 ) ⋯ ( 1 − 1 p k ) \phi(a^b) = a^{b-1}\cdot\ a \cdot\ (1- \frac{1}{p_1})\ \cdot (1-\frac{1}{p_2})\ \cdots (1-\frac{1}{p_k}) ϕ(ab)=ab−1⋅ a⋅ (1−p11) ⋅(1−p21) ⋯(1−pk1)

然后因为由于分数的关系我们可以等价变换为 r e s ⋅ ( 1 − 1 p ) = r e s p ⋅ ( p − 1 ) res\ \cdot\ (1-\frac{1}{p}) = \frac{res}{p}\ \cdot\ (p-1) res ⋅ (1−p1)=pres ⋅ (p−1) 因为 p p p 是 r e s res res 的一个质因数所以肯定能整除,另外为什么要分解成 a b − 1 a^{b-1} ab−1 也是这个原因,不然自己一个不能整除。

题目描述:

复制代码
给定 a,b,求 1≤x<ab 中有多少个 x 与 ab 互质。

由于答案可能很大,你只需要输出答案对 998244353 取模的结果。

输入格式
输入一行包含两个整数分别表示 a,b,用一个空格分隔。

输出格式
输出一行包含一个整数表示答案。

数据范围
对于 30% 的评测用例,ab≤106;
对于 70% 的评测用例,a≤106,b≤109;
对于所有评测用例,1≤a≤109,1≤b≤1018。

输入样例1:
2 5
输出样例1:
16
输入样例2:
12 7
输出样例2:
11943936

示例代码:

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y second

const int N = 1e5+10, MOD = 998244353;

LL a, b;

LL qmi(LL a, LL k)
{
	LL res = 1;
	while(k)
	{
		if(k&1) res = res * a % MOD;
		k >>= 1;
		a = a * a % MOD;
	}
	return res;
}

int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> a >> b;
	
	LL res = a, x = a;
	for(int i = 2; i <= x / i; ++i)
	{
		if(x % i == 0)
		{
			res = (res / i * (i - 1)) % MOD;
			while(x % i == 0) x /= i;
		}
	}
	if(x > 1) res = (res / x * (x - 1)) % MOD;
	
	res = qmi(a,b-1) * res % MOD;
	if(a == 1) res = 0;
	
	cout << res << endl;
	
	
	return 0;
}
相关推荐
汇能感知8 分钟前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun32 分钟前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
好家伙VCC39 分钟前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
茯苓gao1 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾1 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
利刃大大1 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
DKPT2 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa2 小时前
HTML和CSS学习
前端·css·学习·html
ST.J2 小时前
前端笔记2025
前端·javascript·css·vue.js·笔记