等差数列
等比数列
乘法逆元
对于任意整数 而言,如果 和 互质,存在一个整数 使得
为 在 模 意义下的乘法逆元 ,记为
不定方程 有解的充要条件是 互质。
费马小定理: 若 是质数,对任意整数 不是 的倍数,有 ,也可以写作 。
证明: 根据同余的性质, 分别 的结果各不相同。那么:
如何求乘法逆元:若 是质数,则有 ,而 ,所以 是 模 意义下的的乘法逆元。
可以用快速幂,时间复杂度为
扩展欧几里得
=
=
=
= +
,
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;
}