51nod1227-平均最小公倍数【杜教筛,欧拉函数】

1|0正题

题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1227


1|1题目大意

定义

F(a)=i=1alcm(a,i)a

给出l,ri=lrF(i)


1|2解题思路

好久没做数论题了
直接拆成两个前缀和的差,然后有

i=1nj=1ijgcd(i,j)

d=1n1di=1nj=1ij[gcd(i,j)=d]

d=1ni=1ndj=1ij[gcd(i,j)=1]

12+d=1ni=1ndφ(i)i2

函数H(n)=φ(n)n可以用杜教筛,H×id就可以得到n2的函数。


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll long long using namespace std; const ll N=5e6,P=1e9+7; ll cnt,pri[N/10],phi[N]; bool v[N];map<ll,ll> mp; void Prime(){ phi[1]=1; for(ll i=2;i<N;i++){ if(!v[i])pri[++cnt]=i,phi[i]=i-1; for(ll j=1;j<=cnt&&i*pri[j]<N;j++){ v[i*pri[j]]=1; if(i%pri[j]==0){ phi[i*pri[j]]=phi[i]*pri[j]; break; } phi[i*pri[j]]=phi[i]*(pri[j]-1); } } for(ll i=1;i<N;i++) phi[i]=(phi[i]*i+phi[i-1])%P; return; } ll GetS(ll n) {return n*(n+1)/2%P;} ll GetSS(ll n) {return n*(n+1)%P*(2*n+1)%P*((P+1)/6)%P;} ll GetPhi(ll n){ if(n<N)return phi[n]; if(mp[n])return mp[n]; ll ans=GetSS(n); for(ll l=2,r;l<=n;l=r+1){ r=n/(n/l); (ans-=GetPhi(n/l)*(GetS(r)-GetS(l-1))%P)%=P; } mp[n]=ans; return ans; } ll solve(ll n){ ll ans=0; if(!n)return 0; for(ll l=1,r;l<=n;l=r+1){ r=n/(n/l); (ans+=(GetPhi(n/l)+1)*(r-l+1)%P)%=P; } return ans*((P+1)/2)%P; } signed main() { ll l,r,ans;Prime(); scanf("%lld%lld",&l,&r); ans=(solve(r)-solve(l-1))%P; printf("%lld\n",(ans+P)%P); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15531101.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示