此次编程培训和主要和编程数学相关
1.进制转换
练习题 P1143
2.gcd,lcm
gcd:除数变被除数,余数变除数,直到余数为0时,除数就是最大公约数
lcm:二者乘积除以最大公约数
3.前缀和,差分
前缀和用于查找区间和,时间复杂度为O(1)
构建前缀和数组:sum[i]=sum[i-1]+a[i];(下标从1开始存储)
使用前缀和数组([l,r]区间和):sum[r]-sum[l-1]
差分的生成(num用于存储这一个元素和上一个元素的差)
for(int i=1;i<=n;i++){
cin>>a[i];
num[i]=a[i]-a[i-1];
}
使用:把[l,r]区间的所有元素+c
sum[l]+=c;
sum[r+1]-=c;
4.欧拉筛
欧拉筛只被自己的最小质因子筛除
一般模板如下:
bool st[1005],pirme[1005],cnt=0;
void ola(int n){
for(int i=2;i<=n;i++){
if(st[i]==0){
prime[++cnt]=i;
}//如果没有被筛除则记录为素数
for(int j=1;j<=cnt&&prime[j]*i<=n;j++){//遍历prime数组
st[prime[j]*i]=1;//意图删掉prime[j]*i
if(i%prime[j]==0){
break;
} //如果已经找到了最小质因子则break
}
}
}//欧拉筛时间复杂度约为O(n)
5.唯一分解定理
任何一个合数等于多个质数幂的乘积
int base[105],power[105],cnt=0;
void only(int n){
for(int i=2;i*i<=n;i++){//找因数
if(n%i==0){
base[++cnt]=i;//存储底数
while(n%i==0){
n/=i;
power[cnt]++;
}//存储幂次
}
}
if(n>1){//如果还没除尽
base[++cnt]=n;
power[cnt]=1;
}
}
例:36=2^2*3*2
因数个数=所有幂次加一再相乘=(2+1)*(2+1)
因数之和=(2^0+2^1+2^2)*(3^0+3^1+3^2)=91
练习题:UVA10791
6.快速幂
while(b!=0){
if(b&1){
fac=fac*a%p;
//不能写成fac*=a%p
}
b>>=1;
a*=a;
}
1054

被折叠的 条评论
为什么被折叠?



