杜教筛 (包括线筛) 莫比乌斯函数前缀和 欧拉函数前缀和 因数和函数前缀和 因子个数前缀和 ( 分析 )...
对于莫比乌斯函数 和 欧拉函数 小于 1e8差不多都可线筛 1e12以内 杜教筛
代码针对洛古 p4213 n<=(1<<31)-1 杜教筛
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=5e6+10; bool vis[maxn]; int prime[maxn/7]; int phi[maxn]; int mu[maxn]; int tot=0; ll sum_phi[maxn]; int sum_mu[maxn]; void get_mu_phi(){int n=maxn-1;mu[1]=1;phi[1]=1;for(int i=2;i<=n;i++){if(vis[i]==0) { prime[++tot]=i; phi[i]=i-1; mu[i]=-1; }for(int j=1;j<=tot && i*prime[j]<=n;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}mu[i*prime[j]]=-mu[i];phi[i*prime[j]]=phi[i]*(prime[j]-1);}}for(int i=1;i<=n;i++) sum_mu[i]=sum_mu[i-1]+mu[i];for(int i=1;i<=n;i++) sum_phi[i]=sum_phi[i-1]+phi[i]; } unordered_map<int,int> mp_mu; int get_mu(int n){if(n<maxn) { return sum_mu[n]; }ll ans=0;for(int l=2,r;l<=n;l=r+1){r=n/(n/l); int d=(n/l);if(d<maxn) { ans+=(r-l+1)*sum_mu[d]; }else { if(mp_mu.find(d)==mp_mu.end()) mp_mu[d]=get_mu(d); ans+=(r-l+1)*mp_mu[d]; }if(r==2147483647) break;}return mp_mu[n]=1-ans; } unordered_map<int,ll> mp_phi; ll get_phi(int n){if(n<maxn) { return sum_phi[n]; }ll ans=0;for(int l=2,r;l<=n;l=r+1){r=n/(n/l); int d=(n/l);if(d<maxn) { ans+=(r-l+1)*sum_phi[d]; }else { if(mp_phi.find(d)==mp_phi.end()) mp_phi[d]=get_phi(d); ans+=(r-l+1)*mp_phi[d]; }if(r==2147483647) break;}return mp_phi[n]=1ll*n*(n+1)/2-ans; } void work(int n){ll x=get_phi(n);int y=get_mu(n);printf("%lld %d\n",x,y); } int main(){get_mu_phi(); int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); work(n); } }
View Code
因子和函数前缀和 线筛 (求多个的时候效果突出),杜教都不咋地 整除分块才是王道
LightOJ - 1098 整除分块代码
#include<bits/stdc++.h> #define ll long long using namespace std; int main(){int T; scanf("%d",&T); int tot=0;while(T--){ll n; scanf("%lld",&n);ll ans=0;for(ll l=1,r;l<=n;l=r+1){r=n/(n/l);ans+=1ll*(l+r)*(r-l+1)/2*(n/l);}//cout<<ans<<endl;//cout<<1ll*n*(n+1)/2<<endl;ans++;ans-=n;ans-=1ll*n*(n+1)/2;if(n==0) ans=0;printf("Case %d: %lld\n",++tot,ans);} }
View Code
杜教推出来而是那个分块的........ 通过 I (恒等函数) id( 单位函数 ) = σ (因子和函数)
写个线筛的吧(自己写的 没过过题 随机暴力测了一些样例 过了)
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=5e6+10; int vis[maxn]; int num[maxn]; int prime[maxn/7]; int sigma[maxn]; // yin zi he han shu int tot=0; int pow(int x,int n){int ans=1;while(n){if(n&1) ans=ans*x;x=x*x;n=n/2;}return ans; } void inint(){int n=maxn-1;vis[1]=1;sigma[1]=1;for(int i=2;i<=n;i++){// cout<<i<<endl;if(vis[i]==0) {prime[++tot]=i; vis[i]=i; num[i]=1; sigma[i]=i+1;}for(int j=1;j<=tot&&i*prime[j]<=n;j++){vis[i*prime[j]]=prime[j];if(i%prime[j]==0){num[i*prime[j]]=num[i]+1;;sigma[i*prime[j]]=sigma[i]*(1-pow(vis[i],num[i]+1+1)) / (1-pow(vis[i],num[i]+1));break;}else {num[i*prime[j]]=1;sigma[i*prime[j]]=sigma[i]*(1+prime[j]);}}} } int main(){ //cout<<pow(2,5)<<endl;inint(); //cout<<sigma[4]<<endl;int tot=0; while(1){int n; cin>>n;cout<<sigma[n]<<endl;int ans=0;for(int i=1;i<=n;i++){if(n%i==0) ans+=i;}cout<<ans<<endl; } }
View Code
hdu 5608 莫比乌斯反演+杜教筛
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=5e6+10; const int mod=1e9+7; const int inv2=500000004; const int inv4=250000002; const int inv6=166666668; bool vis[maxn]; int prime[maxn/7]; int mu[maxn]; int tot=0; int sum_mu[maxn]; void get_mu_phi(){int n=maxn-1;mu[1]=1;for(int i=2;i<=n;i++){if(vis[i]==0) { prime[++tot]=i; mu[i]=-1; }for(int j=1;j<=tot && i*prime[j]<=n;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){break;}mu[i*prime[j]]=-mu[i];}}for(int i=1;i<=n;i++) sum_mu[i]=sum_mu[i-1]+mu[i]; } unordered_map<ll,ll> mp_mu; ll get_mu(ll n){if(n<maxn) { return sum_mu[n]; }ll ans=0;for(int l=2,r;l<=n;l=r+1){r=n/(n/l); int d=(n/l);if(d<maxn) { ans+=1ll*(r-l+1)*sum_mu[d]%mod; }else { if(mp_mu.find(d)==mp_mu.end()) mp_mu[d]=get_mu(d); ans+=1ll*(r-l+1)*mp_mu[d]%mod; }}return mp_mu[n]=(1-ans)%mod; } int add(int x){int ans=1ll*x*(x+1)%mod*(2*x+1)%mod*inv6%mod;ans-=1ll*3*(x+1)%mod*x%mod*inv2%mod; ans=ans%mod;ans+=1ll*2*x%mod; ans=ans%mod;return ans; } int make(int l,int r){ return ( add(r)-add(l-1) )%mod; } void work(int n){ll ans=0;for(int l=1,r;l<=n;l=r+1){r=n/(n/l); int d=n/l;if(d<maxn){ans+=1ll*make(l,r)*sum_mu[d]%mod;}else {if(mp_mu.find(d)==mp_mu.end()) mp_mu[d]=get_mu(d);ans+=1ll*make(l,r)*mp_mu[d]%mod;}}printf("%lld\n",(ans%mod+mod)%mod); } int main(){get_mu_phi();int T; scanf("%d",&T);while(T--){int n; scanf("%d",&n); work(n);} }
View Code
https://blog.csdn.net/v5zsq/article/details/52116285 大神的写法 (学不来)
https://www.cnblogs.com/acjiumeng/p/9739793.html 学不来的写法
转载于:https://www.cnblogs.com/Andromeda-Galaxy/p/11161894.html
杜教筛 (包括线筛) 莫比乌斯函数前缀和 欧拉函数前缀和 因数和函数前缀和 因子个数前缀和 ( 分析 )...相关推荐
- 欧拉心算(反演 + 积性函数筛)
欧拉心算 推式子 ∑i=1n∑j=1nϕ(gcd(i,j))=∑d=1nϕ(d)∑i=1nd∑j=1nd[gcd(i,j)==1]=∑d=1nϕ(d)∑k=1ndμ(k)(⌊nkd⌋)2另t=kd=∑ ...
- 欧拉函数|(扩展)欧拉定理|欧拉反演
也许更好的阅读体验 文章目录 欧拉函数 欧拉函数常用性质 欧拉定理 扩展欧拉定理 线性筛法 欧拉反演 欧拉函数 定义 欧拉函数是 小于等于 x的数中与x 互质 的数的 数目 符号 φ ( x ) \v ...
- 欧拉函数+狄利克雷卷积+莫比乌斯函数+莫比乌斯反演+整除分块+杜教筛
Powered by:NEFU AB-IN 文章目录 欧拉函数 狄利克雷卷积 莫比乌斯函数 莫比乌斯反演 P3455 [POI2007]ZAP-Queries 整除分块 P2522 [HAOI2011 ...
- Euler:欧拉函数&素数筛
一.欧拉函数 欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示. 通式: 其中p1, p2--pn为x的所有质因数,x是不为0的整数. 比如x=12,拆成质因数为12=2*2*3, ...
- 素数筛选法(埃氏筛 欧拉筛)
质数筛选法 文章目录 质数筛选法 前言 一.埃氏筛 O(nloglogn)O(nloglogn)O(nloglogn) 二.欧拉筛O(n)O(n)O(n) 总结 前言 当需要大范围内的素数时,例如1e ...
- 【数学专题】约数个数与欧拉函数
整理的算法模板合集: ACM模板 目录 一.约数个数 1. AcWing 1291. 轻拍牛头 2. AcWing 1294. 樱花 2.1 AcWing 197. 阶乘分解 3. AcWing 19 ...
- 初探莫比乌斯反演及欧拉反演
莫比乌斯反演是数论中非常重要的一部分,它可以将一个本来只能用时间复杂度极高的枚举求和过程,通过反演变成一个线性时间复杂度甚至根号级别的时间复杂度的问题.在这里,总结一下本人在学习莫比乌斯反演(附带一部 ...
- 数学知识——欧拉函数
1. 欧拉函数 定义:欧拉函数ψ(n) 表示1~n中与n互质的数的个数 公式:如果一个数可以被分解质因式为N = p1α1 *p2α2--pkαk 则ψ(n) = n(1 - 1/p1)(1 - 1/ ...
- 【欧拉函数】 欧拉函数计算及打表
文章目录 一.欧拉函数简介 二.欧拉函数计算 三.欧拉函数值打表 四.练手题目 一.欧拉函数简介 在数论中,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目(因此φ(1)=1).此函数以 ...
最新文章
- Java—接口与抽象类
- Ubuntu Server 上在安装Nginx时执行./confgiure后提示:C compiler cc is not found
- 0-1背包问题优化算法详解
- 科一主观题刷题 0308
- BestCoder Round #66 (div.2) 1002
- 0923接口——练习题作业
- python小项目之头像右上角加数字
- 如何为Swift进行宏定义
- Xcode6中Swift没有智能提示和自动补全功能
- yuv 420 mp4 flv 视频与acc 各类音视频测试下载地址
- 智鼎逻辑推理题及答案_PreTalent职场说|2020常见校招笔试题型解析
- MapGuide应用开发系列(三)----MapGuide 数据包管理及Maestro亮点功能介绍
- nios IIcommand shell 烧录
- ARM 汇编语言程序设计
- nginx基础:nginx访问限制
- 三元锂电池和磷酸铁锂电池的区别
- 基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习
- ug8.5的java下载_ug8.5下载 UG NX8.5正式版 64位 官方版 下载-脚本之家
- [原文] Application of Polarization Imaging Techniques in Brain Tumor Detection 偏振成像技术在脑肿瘤检测中的应用
- keil工具栏错乱,图标显示不正常,工具栏不小心删除,等keil界面问题
热门文章
- 计算机中所说的云是什么意思,如何理解云计算中的“云”是什么?
- toad导入数据_Oracle 使用TOAD实现导入导出Excel数据
- 灾害应急管理信息化建设“四步走”——以水旱灾害为例
- 思维题:12个硬币中有1个假币,假币的重量与真币不同,如何用天平最多称量3次找出假币?
- NOIP模拟测试19
- Python获取所有股票代码以及股票历史成交数据分析(二)
- 输入身份证号获取信息
- react中用useEffect模拟组件生命周期
- 华为手机日历倒计时_万物皆可盲盒,0元抽华为手机 #茂业盛典倒计时5天#
- Kubernetes web界面kubernetes-dashboard安装