当前位置:网站首页>莫比乌斯反演-小总结
莫比乌斯反演-小总结
2022-07-20 10:07:00 【sophilex】
这两天做了一些莫比乌斯反演的题,现在来稍微总结一下
大意:
求
思路:
将d移到判断式的外面去,
原式=
加上莫比乌斯函数的性质
原式可以继续化为
改为枚举d,可以继续化成
注意到这里后面两坨东西我们是可以用分块来处理的,因为u(k)我们可以去处理出来,那么只要找到每一段相同区间里的u(k)函数的一段前缀和即可
关于莫比乌斯函数的预处理,可以通过欧拉筛来实现,这里贴个板子
void moblus()
{
memset(vis,0,sizeof vis);
mu[1]=1;
for(int i=2;i<=N;i++)
{
if(!vis[i])
{
p[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&i*p[j]<=N;++j)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
{
mu[i*p[j]]=0;
break;
}
else mu[i*p[j]]=-mu[i];
}
}
}
其它的就没什么好说的了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
ll a,b,d;
ll ans=1;
//线性筛法求莫比乌斯函数
bool vis[N]; //标记
int p[N]; //质数
int mu[N];//打表结果
ll cnt=0;
void moblus()
{
memset(vis,0,sizeof vis);
mu[1]=1;
for(int i=2;i<=N;i++)
{
if(!vis[i])
{
p[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&i*p[j]<=N;++j)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
{
mu[i*p[j]]=0;//合数
break;
}
else mu[i*p[j]]=-mu[i];
}
}
}
ll f(ll n,ll m)
{
n/=d;m/=d;
ll ans=0;
for(ll l=1,r=1;l<=min(n,m);l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=(mu[r]-mu[l-1])*(n/l)*(m/l);
}
return ans;
}
int main()
{
cin>>a>>b>>d;
//ans=a/d*(b/d);
moblus();
ll n=min(a,b);
for(int i=1;i<=n;++i) mu[i]+=mu[i-1];
ans=f(a,b);
cout<<ans<<endl;
return 0;
}
再来一道狠一点的
大意:
思路:
如果要转到可以进行莫比乌斯反演的形式,我们可以先枚举i和j的公因子d
原式=
然后就可以转化为
=
那么如果我们令D=d*k的话,
原式可以继续改写为
中间那一坨很明显是可以转化成为欧拉函数的,
最后原式就等于
啊哈,这跟上一道题推出来的式子不是换汤不换药嘛,无非就是求莫比乌斯函数变成了求欧拉函数,基本代码完全没有上面区别
对了,因为这题求的是两两之间的数的公约数的和,不包括数字与数字本身,也不会重复计算,我们最后把这些多余的部分减掉就好了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e6+10;
ll n;
ll p[N];
ll phi[N];
bool vis[N];
ll cnt=0;
inline void init()
{
phi[1]=1;
for(register ll i=2;i<=n;++i)
{
if(!vis[i]) p[++cnt]=i,phi[i]=i-1;
for(register ll j=1;(j<=cnt)&&(i*p[j]<=n);++j)
{
vis[i*p[j]]=1;
if(i%p[j]==0)
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
for(ll i=1;i<=n;++i) phi[i]+=phi[i-1];
// for(int i=1;i<=n;++i) cout<<phi[i]<<' ';
}
inline void solve()
{
ll ans=0;
for(register ll l=1,r=1;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(phi[r]-phi[l-1])*(n/l)*(n/l);
}
printf("%lld",(ans-n*(n+1)/2)/2);
//cout<<(ans-n*(n+1)/2)/2<<endl;
}
int main()
{
scanf("%lld",&n);
init();
solve();
return 0;
}
边栏推荐
- GBase 8s如何处理集合的?
- ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
- 短视频直播系统源码
- 掌握JedisPoolConfig参数配置,学会调优技能
- 数商云:如何实现供应商SRM管理系统的应用价值?
- Redis-String类型
- 《ASP.NET Core 6框架揭秘》实例演示[02]:基于路由、MVC和gRPC的应用开发
- 【u-boot】u-boot运行主线分析【03】—board_init_r
- 创建数据快照失败: lock file [/SiYuan/data/assets/image- 20220702163332-jijwccs.png failed: open /SiYuan/data/assets/image- 20220702163332-jijwccs.png: permission denied; unable to lock file
- look out! A "pit" matched by regular test()
猜你喜欢
随机推荐
Abstraction of operational expressions
聊一聊 C# 后台GC 到底是怎么回事?
2022年个人理财产品都有哪些种类?
Network architecture in Skynet
安科瑞马达监控方案低压电动机回路及馈线配电回路电力能源监测
Ankerui motor monitoring scheme low voltage motor circuit and feeder distribution circuit power energy monitoring
6G: typical applications, key technologies and challenges
Source code of short video live broadcast system
基于CLAR架构打造的宝马i3,并非是简单的“油改电”产品
Some summary of QT | QWidget
LeetCode简单题之强密码检验器 II
[问题已处理]-jenkins传统打包交付流程优化
GBase 8s如何处理集合的?
在 Business Application Studio 里使用 SAP UI5 应用消费 OData 的 Create 和 Delete 操作
Introduction to message queuing
Kettle [practice 03] details of difficulties in classification, analysis and warehousing of KML type files in Shuijing micrograph (complete process example cloud resource sharing: including sql+kjb+kt
基于主动学习和Wi-Fi感知的人体识别系统
Redis-数据结构&&通用命令
Extract excel header
体验了一把线上CPU100%及应用OOM的排查和解决过程