数学知识2.1-欧拉函数与快速幂
一、简述
本文章主要介绍欧拉函数以及快速幂的相关算法。
二、欧拉函数
定义
计算式的证明
情况1
当
当
情况2
当
情况3
对
将
模板题AcWing873.欧拉函数
题目描述
给定
输入格式
第一行包含整数
接下来
输出格式
输出共
数据范围
输入样例
3
3
6
8
输出样例
2
2
4
解题思路
根据欧拉函数的计算式计算即可,时间复杂度
C++代码
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while(n --)
{
int a;
cin >> a;
int res = a;
for(int i = 2; i <= a / i; i ++)
{
if(a % i == 0)
{
res = res / i * (i - 1);
while(a % i == 0)
a /= i;
}
}
if(a > 1) res = res / a * (a - 1);//先除后乘可以避免数值溢出
cout << res << endl;
}
return 0;
}
三、筛法求欧拉函数
思路
借用线性筛进行欧拉函数的计算
模板题AcWing874.筛法求欧拉函数
题目描述
给定一个正整数
输入格式
共一行,包含一个整数
输出格式
共一行,包含一个整数,表示
数据范围
输入样例
6
输出样例
12
解题思路
由于数据范围为
关于代码中
关于代码中
C++代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
typedef long long LL;
int n;
int primes[N], cnt;
int euler[N];
bool st[N];
void get_eulers(int n)
{
euler[1] = 1;//1对应的欧拉函数为1
for(int i = 2; i <= n; i ++)
{
if(!st[i])//i为质数
{
primes[cnt ++] = i;//筛出质数
euler[i] = i - 1;//质数对应的欧拉函数值为本身减1
}
for(int j = 0; primes[j] <= n / i; j ++)
{
int t = primes[j] * i;
st[t] = true;
if(i % primes[j] == 0)//primes[j]为i的一个质因数,同时也是t的质因数
{
//flag1
euler[t] = euler[i] * primes[j];
break;
}
//flag2
euler[t] = euler[i] * (primes[j] - 1);
}
}
}
int main()
{
cin >> n;
get_eulers(n);
LL res = 0;
for (int i = 1; i <= n; i ++ ) res += euler[i];
cout << res << endl;
return 0;
}
四、快速幂
正常计算一个数
模板题AcWing875.快速幂
题目描述
给定
输入格式
第一行包含整数
接下来
输出格式
对于每组数据,输出一个结果,表示
每个结果占一行。
数据范围
输入样例
2
3 2 5
4 3 9
输出样例
4
1
C++代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL qmi(int a, int b, int p)
{
LL res = 1;
while(b)
{
if(b & 1) res = res * a % p;
a = (LL) a * a % p;
b >>= 1;
}
return res;
}
int n;
int main()
{
cin >> n;
while(n --)
{
int a, b, p;
cin >> a >> b >> p;
cout << qmi(a, b, p) << endl;
}
return 0;
}
四、乘法逆元
若整数
欧拉定理
若
证明:已知
模板题AcWing876.快速幂求逆元
题目描述
给定 impossible
。
注意:请返回在
输入格式
第一行包含整数
接下来
输出格式
输出共
若 impossible
。
数据范围
输入样例
3
4 3
8 5
6 3
输出样例
1
2
impossible
C++代码
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long LL;
LL qmi(int a, int k, int p)
{
LL res = 1;
while(k)
{
if(k & 1) res = res * a % p;
a = (LL) a * a % p;
k >>= 1;
}
return res;
}
int n;
int main()
{
cin >> n;
while(n --)
{
int a, p;
cin >> a >> p;
if(a % p == 0) puts("impossible");
else printf("%lld\n", qmi(a, p - 2, p));
}
return 0;
}
本文来自博客园,作者:Cocoicobird,转载请注明原文链接:https://www.cnblogs.com/Cocoicobird/p/16750625.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架