51nod [1227 平均最小公倍数]
题意
求 ,其中 。
题解
众所周知, 。
这个应该是小学只是了吧,我就不证了。(虽然我也不会比较严谨的证明)
加入我们要求一段区间的和,其实只需要能够求前缀就可以了。
所以我们来颓柿子。
欢乐的颓柿子时间
令 , 。
那么上式 。
如果可以快速求出 ,那么就可以直接数论分块了。
那么 代表了什么呢?
不就是小于等于 的所有正整数中,和 互质的所有数的和嘛!
所以有 。
为什么是这样的呢?
当 时,显然没问题, 。
当 时,如果 ,那么肯定也有 。
这告诉我们什么?不就是所有小于等于 的数种中与 互质的数的平均数为 嘛!
小于等于 的数中与 互质的数共有 个,所以上面式子没啥问题。
好,那么我们令 , 。
那么就有 。
既然 是一个积性函数,并且数据范围为 ,考虑使用杜教筛求解。
杜教筛
显然, , 我们设 ,下来搬出杜教筛的式子。
。
又怎么求呢?
。
这个直接求就可以了, 更简单,就不说了。
代码
#include<unordered_map>
#include<cstdio>
using namespace std;
using ll=long long;
const int mod=1000000007;
const ll inv2=500000004;
const ll inv6=166666668;
inline int read()
{
int s=0,w=1;char ch;
while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1;
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
unordered_map<int,ll>mf;
int pri[1000001];
bool is[1000001];
ll f[1000001];
int n;
ll run(int l,int r)
{
return (ll)(r-l+1)*(l+r)/2%mod;
}
ll get(int n)
{
if(n<=1000000) return f[n];
if(mf.count(n)) return mf[n];
ll ans=(ll)n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
for(int l=2,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=(ans-run(l,r)*get(n/l))%mod;
}
return mf[n]=(ans+mod)%mod;
}
ll getS(int n)
{
ll ans=0;
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(r-l+1)*(get(n/l)+1)%mod*inv2%mod;
}
return ans%mod;
}
int main()
{
// freopen("data.in","r",stdin);
n=1000000,f[1]=1;
for(int i=2;i<=n;i++)
{
if(!is[i]) pri[++pri[0]]=i,f[i]=i-1;
for(int j=1;j<=pri[0]&&i*pri[j]<=n;j++)
{
is[i*pri[j]]=1;
if(i%pri[j]==0)
{
f[i*pri[j]]=f[i]*pri[j];
break;
}
f[i*pri[j]]=f[i]*(pri[j]-1);
}
}
for(int i=1;i<=n;i++) f[i]=(f[i]*i+f[i-1])%mod;
int l=read(),r=read();
// for(int i=1;i<=n+1;i++) printf("%lld ",get(i));
printf("%lld\n",(getS(r)-getS(l-1)+mod)%mod);
return 0;
}
本文来自博客园,作者:Wuyanru,转载请取得作者同意并注明原文链接:https://www.cnblogs.com/Wuyanru/p/51nod-1227.html
本文内容如有侵权行为,请联系作者删除,qq:1395170470
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!