【数学1】基础数学问题 知识点总结
前言
本篇文章是luogu官方题单【数学1】基础数学问题 的相关知识点个人总结
埃氏筛 & 欧拉筛 (基础)
虽然理论上欧拉筛比埃氏筛快,但是因为埃氏筛有cache,实际运行比欧拉筛要快
目前本人只见过欧拉筛模版题会卡这个(乐),但其实埃氏筛稍微优化一下常数甚至比欧拉筛跑的还快
埃氏筛完全够用
- 埃氏筛
//不用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; }
欧拉筛
#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; }
质因数 (很多题都用到了)
对于合数
复杂度压到根号的原理
最大公因数 & 最小公倍数
- 最大公因数gcd
ll gcd(ll x,ll y){ return (y==0?x:gcd(y,x%y)); }
- 最小公倍数lcm
- 推导公式
排列组合
欧拉函数(P3601签到题)
-
标准分解式:x的质因数从小到大幂之积
-
欧拉函数:小于等于x的正整数中与x互质的数的个数
对于欧拉函数有个很巧妙的求法
因为
先令
找到
对
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律