等差数列
等比数列
乘法逆元
对于任意整数 而言,如果
和
互质,存在一个整数
使得
为
在 模
意义下的乘法逆元 ,记为
不定方程 有解的充要条件是
互质。
费马小定理: 若 是质数,对任意整数
不是
的倍数,有
,也可以写作
。
证明: 根据同余的性质, 分别
的结果各不相同。那么:
如何求乘法逆元:若 是质数,则有
,而
,所以
是
模
意义下的的乘法逆元。
可以用快速幂,时间复杂度为
扩展欧几里得
=
=
=
= +
,
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
ll d,x1,y1;
d = exgcd(b,a%b,x1,y1);
x = y1;
y = x1 - a / b * y1;
return d;
}
若 (
为
的 倍数) 答案为
*
通解
证明
递推求逆元
给定 ,求 1~
在 模
意义下的逆元 ,
为 质数
阶乘逆元
给定,求 1~
每个数阶乘在模
意义下的逆元
算术基本定理
N =
(
为质数)
那么
N 的 约数个数 : (N) = (1 +
) * (1 +
) * (1 +
) *
(1 +
)
N 的各约数之和 : (N) = (1 +
+
+
) * (1 +
+
** +
) *
* (1 +
+
+
))
N ! 进行算术基本定理的分解
- 找到 1~N 中 质数
- **每个质数 的指数 : **
+
+
直至 N <
,除出结果为0
组合数取模
=
**(乘法逆元 取模 m <= n <
) 模为大质数 费马小定理 合数为exgcd **
** = **
+
(预处理 递推打标取模 m <= n < 2000)
Lucas 定理 % p =
*****
p (n , m <
, (质数)p <
)
当 (n,m < p 时 ) return C(n,m,p)
= 1;
求,并从小到大输出
筛质因子
表示一个数最小的质因子
能够在 线性筛的过程中全部找出来
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 50;
const int P = 10007;
typedef long long ll;
const int M = 2007;
int n,m,k;
int plist[N];
int mindiv[N * 10];
bool not_prime[N * 10];
void init() {
int T = 1e7;
int cnt = 0;
mindiv[1] = 1;
for(int i = 2;i <= T; i ++) {
if(not_prime[i] == false) {
plist[++ cnt] = i;
mindiv[i] = i;
}
for(int j = 1; j <= cnt; j ++) {
int x = i * plist[j];
if(x > T) break;
not_prime[x] = true;
mindiv[x] = plist[j];
if(i % plist[j] == 0) break;
}
}
return;
}
void solve() {
scanf("%d",&n);
while(n != 1) {
int div = mindiv[n];
if(mindiv[n] == div) {
printf("%d ", div);
while(mindiv[n] == div) {
n /= div;
}
}
}
printf("\n");
return;
}
int main() {
int _ = 1;
cin >> _;
init();
while(_ --) {
solve();
}
return 0;
}