1.高精加减乘除
列个竖式模拟下就行
用字符读入,then用int数组倒序存;
负数的话转换一下
高精除主要是考 高精除以单精
2.模意义下运算
3.快速幂
a^b = a^(b/2)* a^(b/2) =(a^(b/2)) ^2;
if(b%2==1) a^b= a^(b/2)* a^(b/2)*a;
long long tmp=1;
while(b){
if(b%2==1) tmp=tmp*a%MOD;
a=a*a%MOD;
b/=2;
}
return tmp;
4.最大公约数,最小公倍数
teacher看着都写过就直接略过
int gcd(int a,int b)
{
if(!b) return a;
return gcd(b,a%b);
}
最小公倍数=a*b/gcd(a,b);
5. 素数筛
埃式筛法
枚举每个数,如果当前数是质数,把该数的倍数全都做上标记,继续往下;没做标记的就是质数;
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[++m]=i;
for(int j=i;j<=n/i;j++)
vis[i*j]=1;
}
}
线式筛法
埃式筛中,有的数被重复筛,例如12 =2 * 6=3 * 4;
线性筛就是让每个数只被它的最小质因子筛一遍;
for(int i=2;i<=n;i++){
if(!vis[i]) prime[++m]=i;
for(int j=1;j<=m&&i*prime[j]<=n;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
6.费马小定理
如果a,p互质,那么a^(p-1)%p=1;
7.逆元
在两数互质条件下;
在模意义下不能直接做除法运算,这时就用到了逆元;
a 在mod p意义下的逆元=a^(p-2);
设a的逆元是c,则ac%mod=1;
(b/a)%mod=(b/a) * 1%mod=(b/a) * ac%mod=b*c%mod;
8.欧拉函数 Φ(n)为小于等于n的与n互质的数的个数;
欧拉定理 (a^Φ(n)) %n=1;
此时逆元 a^(Φ(n)-1)= a^(-1);
for(int i=1;i<=n;i++)
if(rec[i]==i)phi[i]=i-1;//rec[i]表示i的最小质因子;phi[i]表示Φ(i);
else
if( (i%(rec[i]*rec[i])==0)// 自己可以把18和36分解质因数,看看他们两个数的欧拉函数之间有什摸规律;然后就可以推出这代码了;
phi[i]=phi[i/rec[i]]*rec[i];
else
phi[i]=phi[i/rec[i]]*(rec[i]-1);