【数学1】基础数学问题 知识点总结

前言

本篇文章是luogu官方题单【数学1】基础数学问题 的相关知识点个人总结

埃氏筛 & 欧拉筛 (基础)

虽然理论上欧拉筛比埃氏筛快,但是因为埃氏筛有cache,实际运行比欧拉筛要快
目前本人只见过欧拉筛模版题会卡这个(乐),但其实埃氏筛稍微优化一下常数甚至比欧拉筛跑的还快
埃氏筛完全够用

  • 埃氏筛 O(nloglogn)
//不用vector<ll>记录质数
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n;
vector<bool> not_prime(n+1,false);
not_prime[1]=true;
for(ll i=2;i*i<=n;i++){
for(ll j=i*i;j<=n;j+=i){
not_prime[j]=true;
}
}
return 0;
}
//记录小于等于n的质数
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q,k;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>q;
vector<bool> not_prime(n+1,false);
vector<ll> vec;
not_prime[1]=true;
for(ll i=2;i<=n;i++){
if(!not_prime[i]){
vec.push_back(i);
for(ll j=i*i;j<=n;j+=i){
not_prime[j]=true;
}
}
}
return 0;
}

欧拉筛 O(n)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q,k;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>q;
vector<bool> vis(n+1,true);
vector<ll> vec;
for(ll i=2;i<=n;i++){
if(vis[i]){
vec.push_back(i);
}
for(ll j=0;i*vec[j]<=n;j++){
vis[vec[j]*i]=false;
if(i%vec[j]==0){
break;
}
}
}
return 0;
}

质因数 (很多题都用到了)

对于合数 x,最大质因子不超过x
复杂度压到根号的原理

最大公因数 & 最小公倍数

  • 最大公因数gcd
ll gcd(ll x,ll y){ return (y==0?x:gcd(y,x%y)); }
  • 最小公倍数lcm

lcm(x,y)=xygcd(x,y)

  • 推导公式

gcd(x,y)=zgcd(x/z,y/z)=1

gcd(x,y)=xylcm(x,y)

排列组合

C(n,m)=C(n1,m1)+C(n1,m)

C(n,m)=n!m!(nm)!

欧拉函数(P3601签到题)

  1. 标准分解式:x的质因数从小到大幂之积
    x=p1k1p2k2...pnkn

  2. 欧拉函数:小于等于x的正整数中与x互质的数的个数
    ϕ(x)=i=1n(pi1)piki1

对于欧拉函数有个很巧妙的求法
因为 x 中本身就含有 piki
先令 ϕ(x)=x
找到 x 的质因数 pi
ϕ(x) 直接除 pi 再乘 pi1 即可

posted @   Gusare  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示