【数论】莫比乌斯反演(欧拉反演)进阶-杜教筛

文章目录

      • 前言
    • 回忆
  • 题集
    • 1
    • 2
  • 杜教筛
    • 例题

前言

这里需要对莫反有一些基础
不会的可以点这里

回忆

  • f ( n ) = ∑ d ∣ n g ( d ) → g ( n ) = ∑ d ∣ n f ( d ) μ ( n d ) f(n)=\sum_{d|n}g(d)\rightarrow g(n)=\sum_{d|n}f(d)\mu(\frac{n}{d}) f(n)=dng(d)g(n)=dnf(d)μ(dn)
  • ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n}\mu(d)=[n=1] dnμ(d)=[n=1]
  • ∑ i = 1 n ⌊ n i ⌋ = \sum_{i=1}^n\left\lfloor\frac{n}{i}\right\rfloor= i=1nin= 你应该知道怎么求
  • ∑ i = 1 1 0 9 μ ( i ) = \sum_{i=1}^{10^9}\mu(i)= i=1109μ(i)= 你可能需要知道怎么求
  • 线性筛 μ ( i ) , φ ( i ) \mu(i),\varphi(i) μ(i),φ(i)
  • 一些数学能力

题集

1

∏ i = 1 n ∏ j = 1 m gcd ⁡ ( i , j ) \large\prod_{i=1}^n\prod_{j=1}^m\gcd(i,j) i=1nj=1mgcd(i,j)
= ∏ d = 1 d ∑ i = 1 ∑ j = 1 m [ gcd ⁡ ( i , j ) = d ] =\prod_{d=1}d^{\sum_{i=1}\sum_{j=1}^m[\gcd(i,j)=d]} =d=1di=1j=1m[gcd(i,j)=d]
= ∏ d = 1 d ∑ k = 1 min ⁡ ( n , m ) d μ ( k ) n k d m k d =\prod_{d=1}d^{\sum_{k=1}^\frac{\min(n,m)}{d}\mu(k)\frac{n}{kd}\frac{m}{kd}} =d=1dk=1dmin(n,m)μ(k)kdnkdm
= ∏ T = 1 ( ∏ k ∣ T ( T k ) μ ( k ) ) n T m T =\prod_{T=1}(\prod_{k|T}(\frac{T}{k})^{\mu(k)})^{\frac{n}{T}\frac{m}{T}} =T=1(kT(kT)μ(k))TnTm
f ( T ) = ∏ k ∣ T ( T k ) μ ( k ) f(T)=\prod_{k|T}(\frac{T}{k})^{\mu(k)} f(T)=kT(kT)μ(k)
线性筛+整出分块即可
Code:

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
#define cou(i) cout<<fixed<<setprecision(i)
using namespace std;
const int N=1e7+1,mod=1e9+7;
int t,n,m,k,ans,res;
unordered_map<int,int>Mu;
struct fy{int prv[N],cnt,mu[N],F[N];bool pr[N];int qmi(int x,int y){int res=1;while(y>0){if(y&1)res=res*x%mod;x=x*x%mod,y>>=1;}return res;}void ola(int x){pr[1]=mu[1]=F[1]=1;for(int i=2;i<=x;i++){if(!pr[i])prv[++cnt]=i,mu[i]=-1,F[i]=i;for(int j=1;j<=cnt&&i*prv[j]<=x;j++){int u=i*prv[j];pr[u]=1;if(i%prv[j]==0){mu[u]=0;F[u]=F[i];break;}else{mu[u]=-mu[i];F[u]=1;}}}}void getsum(int x){F[0]=1;for(int i=1;i<=x;i++){F[i]*=F[i-1],F[i]%=mod; }}int summu(int x){int res=1;if(x<N)return mu[x];if(Mu[x])return Mu[x];for(int l=2,r;l<=x;l=r+1){r=x/(x/l);res-=(summu(x/l))*(r-l+1);}Mu[x]=res;return res;}int sumphi(int x){int res=0;for(int l=1,r;l<=x;l=r+1){r=x/(x/l);res+=(summu(r)-summu(l-1))*(x/l)*(x/l);}return res;}
}A;
signed main(){IOS;A.ola(N-1);A.getsum(N-1);cin>>t;while(t--){cin>>n>>m;int ans=1ll;for(int l=1,r;l<=min(n,m);l=r+1){r=min(n/(n/l),m/(m/l));int res=A.F[r]*A.qmi(A.F[l-1],mod-2)%mod;ans=ans*A.qmi(res,(n/l)*(m/l))%mod;}cout<<ans<<"\n";}return 0;
}

经验:
1
2
3

2

Link
在这里插入图片描述
暴力推式子。
关键:
gcd ⁡ ( i j , j k , k i ) = gcd ⁡ ( i , j ) gcd ⁡ ( j , k ) gcd ⁡ ( k , i ) gcd ⁡ ( i , j , k ) \large{\gcd(ij,jk,ki)=\frac{\gcd(i,j)\gcd(j,k)\gcd(k,i)}{\gcd(i,j,k)}} gcd(ij,jk,ki)=gcd(i,j,k)gcd(i,j)gcd(j,k)gcd(k,i)
然后可得原式=于神之怒加强版或这里
好像这黑题有那么一点点水啊
Code:

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL)
using namespace std;
const int N=2e7+1,mod=1e9+7;
int t,n,m,p,k;
struct fy{int prv[N],cnt,g[N],s[N];bool pr[N];inline int qmi(int x,int y){int res=1;while(y>0){if(y&1)res=res*x%mod;x=x*x%mod,y>>=1;}return res;}void ola(int x){pr[1]=g[1]=1;for(int i=2;i<=x;i++){if(!pr[i])prv[++cnt]=i,g[i]=(qmi(i,k)-1+mod)%mod;for(int j=1;j<=cnt&&i*prv[j]<=x;j++){int u=i*prv[j];pr[u]=1;if(i%prv[j]==0){g[u]=g[i]*qmi(prv[j],k)%mod;break;}else{g[u]=g[i]*g[prv[j]]%mod;}}}}void getsum(int x){for(int i=1;i<=x;i++)g[i]=(g[i]+g[i-1])%mod;}
}A;
signed main(){IOS;k=2;cin>>t;A.ola(N-1);A.getsum(N-1);while(t--){cin>>n>>m>>p;int ans=0,res=0;for(int l=1,r;l<=min(n,m);l=r+1){r=min(n/(n/l),m/(m/l));res+=(n/l)*(m/l)%mod*((A.g[r]-A.g[l-1]+mod)%mod)%mod;res%=mod;}ans+=res*p;ans%=mod;res=0;for(int l=1,r;l<=min(m,p);l=r+1){r=min(m/(m/l),p/(p/l));res+=(m/l)*(p/l)%mod*((A.g[r]-A.g[l-1]+mod)%mod)%mod;res%=mod;}ans+=res*n;ans%=mod;res=0;for(int l=1,r;l<=min(p,n);l=r+1){r=min(p/(p/l),n/(n/l));res+=(p/l)*(n/l)%mod*((A.g[r]-A.g[l-1]+mod)%mod)%mod;res%=mod;}ans+=res*m;ans%=mod;cout<<ans<<"\n";}return 0;
}

杜教筛

来自 OI-wiki的资料:

这里直达

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里直达OI-wiki


例题

给定一个正整数,求
a n s 1 = ∑ i = 1 n φ ( i ) , a n s 2 = ∑ i = 1 n μ ( i ) ans_1=\sum_{i=1}^n\varphi(i),ans_2=\sum_{i=1}^n \mu(i) ans1=i=1nφ(i),ans2=i=1nμ(i)
输入的第一行为一个整数,表示数据组数 T T T
接下来 T T T 行,每行一个整数 n n n,表示一组询问。
对于每组询问,输出一行两个整数,分别代表 a n s 1 ans_1 ans1 a n s 2 ans_2 ans2
对于全部的测试点,保证 1 ≤ T ≤ 10 1 \leq T \leq 10 1T10 1 ≤ n < 2 31 1 \leq n \lt 2^{31} 1n<231
考虑使用杜教筛。
S 1 ( n ) = ∑ i = 1 n μ ( i ) S_1(n)=\sum_{i=1}^n\mu(i) S1(n)=i=1nμ(i)
在这里插入图片描述
在这里插入图片描述
那样我们就完成了两个最简单的例题了
Code:

#include<bits/stdc++.h>
#define int __int128
using namespace std;
const int N=2e6+1,mod=1e9+7;
int t,n,m,k;
void write(int x){if(x<0)putchar('-'),x=-x;if(x>=10)write((int)(x/10));char o='0'+x%10;putchar(o);
}
void read(int &x){x=0;int y=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-'){y=-1;break;}c=getchar();}while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();x*=y;
}
map<int,int>Mu,Phi;
struct fy{int prv[N],cnt,phi[N],mu[N];bool pr[N];void ola(int x){pr[1]=mu[1]=1;for(int i=2;i<=x;i++){if(!pr[i])prv[++cnt]=i,mu[i]=-1;for(int j=1;j<=cnt&&i*prv[j]<=x;j++){int u=i*prv[j];pr[u]=1;if(i%prv[j]==0){mu[u]=0;break;}else{mu[u]=-mu[i];}}}}void getsumF(int x){for(int i=1;i<=x;i++)mu[i]+=mu[i-1];}int summu(int x){int res=1;if(x<N)return mu[x];if(Mu[x])return Mu[x];for(int l=2,r;l<=x;l=r+1){r=x/(x/l);res-=(summu(x/l))*(r-l+1);}Mu[x]=res;return res;}int sumphi(int x){int res=0;for(int l=1,r;l<=x;l=r+1){r=x/(x/l);res+=(summu(r)-summu(l-1))*(n/l)*(n/l);}return res;}
}A;
signed main(){A.ola(N-1);A.getsumF(N-1);read(t);while(t--){read(n);write((A.sumphi(n)-1)/2+1);putchar(' ');write(A.summu(n));putchar('\n');}return 0;
}
//此代码有一点瑕疵,但确实可以过模板题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows如何优雅的运行ROS2/linux

Windows如何优雅的运行ROS2/linux 前言 在ROS/ROS2开发过程中&#xff0c;大家普遍使用到的分布式开发方法都是基于虚拟机/双系统进行&#xff0c;本质上是希望基于Ubuntu良好的生态环境进行&#xff0c;但是两种方式各有各自的好处&#xff0c;也有各自的弊端&#xff0c;例…

docker 部署 nali 开源 IP 地理信息归属查询软件

前言 早前用到一个小巧开源的 IP 归属地查询软件&#xff0c;官方提供了 Dockerfile&#xff0c;使用了一段时间觉得还不错&#xff0c;非常简单便捷。 部署 docker 启动 由于该项目会在首次启动自动下载 IP 数据库,所以最好通过挂载目录的方式,将数据库目录挂在到本地,避免…

Java零基础入门到精通_Day 4

方法的重载 就是同一个类中的相同方法名的多个方法&#xff0c;但是他们的参数不同&#xff0c;类型不同或者参数个数不同。 &#xff08;与返回值无关&#xff09; package Base_One;public class Base_005 {public static void main(String[] args) {// Main method logic …

经久耐用耐强腐蚀PFA材质气体洗涤瓶全氟烷氧基树脂尾气吸收瓶

PFA洗气瓶是一种常用于净化和干燥各种气体的实验室器皿&#xff0c;以去除其中的水分、油脂、颗粒物等杂质&#xff0c;从而使需要用到的气体满足实验要求。 PFA气体吸收瓶 PFA洗气瓶的工作原理&#xff1a; 主要是通过液体吸收、溶解或发生化学反应来去除气体中的杂质。在洗气…

Python基础之pandas:文件读取与数据处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、文件读取1.以pd.read_csv()为例&#xff1a;2.数据查看 二、数据离散化、排序1.pd.cut()离散化&#xff0c;以按范围加标签为例2. pd.qcut()实现离散化3.排序4.…

新质生产力崛起,运营商前端运营如何跃升

“新质生产力”一个当前的热搜高频词&#xff0c;今年还被首次写进政府工作报告&#xff0c;是2024年十大工作任务的首位。那么什么是“新质生产力”&#xff1f;它对于我们的生活、学习、工作及未来发展有什么影响呢&#xff1f;今天小宝就抛砖引玉来讲一讲“新质生产力”对于…

整顿编剧市场:程序员提交测试流程的最佳实践

讲动人的故事,写懂人的代码 最近,一部去年推出的国产电视剧在IT圈子里引起了轰动。 引起关注的原因,并非剧中程序员的外形出众,而是她提交代码测试的方式——将写有代码的纸张放入文件夹,然后递给了对面的测试人员。如图1所示。 图1 程序员将写有代码的纸张放入文件夹,并…

信创(统信)系统上的软件安装及软件使用手册

一.各软件的安装文档 1.达梦数据库在统信系统上的安装 官方手册:https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html 1.1下载安装包 官网:https://www.dameng.com/list_103.html 点击”服务与合作”--> “下载中心” 这里选择对应的cpu和操作…

Git 核心知识

2024年4月2日更新 Git 安装 官网下载&#xff0c;Git 选择合适的版本&#xff0c;无脑下一步即可。 安装成功之后&#xff0c;鼠标右键任意的文件夹&#xff0c;会出现 Git GUI 的选项&#xff0c;即安装成功 安装注意事项 安装前&#xff0c;检查环境变量 &#xff0c; 如…

程序的编译、链接过程分析(简洁浓缩版)!

《嵌入式工程师自我修养/C语言》系列——程序的编译、链接过程分析&#xff08;简洁浓缩版&#xff09;&#xff01; 一、程序的编译1.1 预编译指令 pragma1.2 编译过程概述1.3 符号表和重定位表 二、程序的链接2.1 分段组装2.2 符号决议2.2.1 强符号与弱符号2.2.2 GNU编译器的…

在线考试系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)高校远程网络考试,课程信息,在线考试,试题管理,习题管理课程信息,教师管理,学生管理

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

切换IP地址的软件的基本原理及相关知识

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;扮演着至关重要的角色。然而&#xff0c;在某些特定情况下&#xff0c;我们可能需要隐藏或更改自己的IP地址&#xff0c;以保护隐私、突破地域限制或进行网络测试等。这时&#xff0c;切换IP地址的软件就显得…

Harmony创建Page省事小技巧

在创建Page页面时&#xff0c;选择ArkTS File时&#xff0c;创建的文件不会自动生成基础代码&#xff0c;也不会自动在main_page.json中自动进行注册&#xff0c;如何解决问题呢&#xff0c;其实很简单创建Page页面时选择Page项后就会创建Page文件&#xff0c;创建完的页面会自…

放弃“颜值”,15年的美图开始拼“生产力”

文&#xff5c;郝 鑫 “美图是一家AI公司”&#xff0c;美图在2023年财报的一开头就迫不及待地重申了自己的“新身份”。 这背后源于美图去年到现在对AIGC的一连串疯狂押注。 2023年6月&#xff0c;美图一口气发布了美图视觉大模型MiracleVision和六款AI产品&#xff0c;…

护眼灯值不值得买?业界公认的护眼台灯十大排名盘点

在这个信息爆炸的时代&#xff0c;用眼时间不断延长&#xff0c;长时间用眼不仅易导致视觉疲劳&#xff0c;还可能对视力健康造成长远影响。因此&#xff0c;除了适时休息&#xff0c;确保所处光线环境健康同样重要。然而&#xff0c;灯光环境往往不尽如人意。此时&#xff0c;…

状态压缩DP

哈密顿路径问题&#xff1a; 一般设 表示 状态下&#xff0c;为最后一个最值情况 。 一般有两种稍微不同的写法&#xff0c;单纯就是写法不同&#xff0c;思路方法都相同。 第一个例题为第一种转移方法&#xff0c;有当前转移后面。 后面的都是由前面转移目前。 G. Shuff…

是谁?写的Java神作一出版就获Jolt图书大奖【抽奖赠书】

送书活动 1️⃣参与方式&#xff1a;点此参与抽书抽奖 2️⃣获奖方式&#xff1a;小程序随机 抽5位&#xff0c;每位小伙伴一本《Effective Java中文2024版》 3️⃣活动时间&#xff1a;截止到 2024-4-6 12:01:00 注&#xff1a;所有抽奖活动都是全国范围免费包邮到家&#xff…

MP4文件中h264的 SPS、PPS获取

MP4文件中h264的SPS、PPS获取 如下图所示&#xff0c;为avcC 1 【参考依据】ISO/IEC 14496-15 2 【综述】在H264中&#xff0c;SPS和PPS存在于NALU header中&#xff0c;而在MP4文件中&#xff0c;SPS和PPS存在于AVCDecoderConfigurationRecord&#xff0c; 首先要定位avcC. …

Ant Design Vue中的table与pagination的联合使用

效果&#xff1a; 代码&#xff1a; <a-table:dataSource"dataSource":columns"columns":pagination"pagination"change"handleTableChange":scroll"{ x: 100%, y: 600 }"> </a-table> export default defin…

kubernetes-Pod基于污点、容忍度、亲和性的多种调度策略(二)

Pod调度策略 一.污点-Taint二.容忍度-Tolerations三.Pod常见状态和重启策略1.Pod常见状态2.Pod的重启策略2.1测试Always重启策略2.2测试Never重启策略2.3测试OnFailure重启策略&#xff08;生产环境中常用&#xff09; 一.污点-Taint 在 Kubernetes 中&#xff0c;污点&#x…