跪了一下午数论
整理了一下数论模板
这是个史前巨坑,有空慢慢填
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 1000000 using namespace std; bool not_prime[MAXN]; int prime_number[MAXN]; int nu; int factor[MAXN];//顺手记录一下最小质因子 void prime()//线筛 { for (int i=2;i<=MAXN;i++) { if (!not_prime[i]) { prime_number[++nu]=i; factor[i]=i; } for (int j=1;j<=nu&&i*prime_number[j]<=MAXN;j++) { not_prime[i*prime_number[j]]=1; f[i*prime_number[j]]=prime_number[j]; if (i%prime_number[j]==0) break; } } } int mu[MAXN]={0,1}; void mu()//莫比乌斯函数 { for (int i=2;i<=MAXN;i++) { if (!not_prime[i]) mu[i]=-1; for (int j=1;j<=nu&&i*prime_number[j]<=MAXN;j++) { not_prime[i*prime_number[j]]=1; if (i%prime_number[j]==0) { mu[i*prime_number[j]]=0; break; } else { mu[i*prime_number[j]]=-mu[i]; } } } } int phi[MAXN]; void phi()//欧拉函数 { for (int i=2;i<=MAXN;i++) { if (!not_prime[i]) { phi[i]=i-1; } for (int j=1;j<=nu&&i*prime_number[j]<=MAXN;j++) { not_prime[i*prime_number[j]]=1; if (i%prime_number[j]==0) { phi[i*prime_number[j]]=phi[i]*prime_number[j]; break; } else { phi[i*prime_number[j]]=phi[i]*(prime_number[j]-1); } } } } int inv[MAXN]; //以下连续逆元 void inv1()//费马小定理 { for (int i=1;i<=MAXN;i++) inv[i]=pow(i,phi[p]-1)%p;//p根据题目要求不同来定 } void inv2()//基于线筛的求法 { for (int i=2;i<=MAXN;i++) { int a=p/i; int b=p%i; inv[i]=(p-a)*inv[b]%p; } } void inv3()//基于阶乘的求法 { unsigned long long a[MAXN]={1},rev[MAXN];//这个阶乘略大0-0不想写高精度了unsigned凑活看着吧 for (int i=1;i<=MAXN;i++) a[i]=a[i-1]*i; rev[MAXN]=pow(a[MAXN],phi[p]-1)%p; for (int i=MAXN-1;i>=0;i--) rev[i]=rev[i+1]*(i+1)%p; for (int i=1;i<=MAXN;i++) inv[i]=a[i-1]*rev[i]; } void inv4()//基于a*i+b=p的求法,此做法仅用于p为素数 { inv[1]=1; for (int i=2;i<=MAXN;i++) { int a=p/i; int b=p%i; inv[i]=(p-a)*inv[b]%p; } } //中国剩余定理,原根,离散对数,Lucas定理做组合数,mobius反演未完待续=。= //感谢LYP神犇的授课。逆元里后三种求法还有莫比乌斯函数都是他讲的。。。 /*int main() { }*/
时间: 2024-12-17 15:15:36