题解:疯狂lcm
%你赛打到一半来写个题解
link:疯狂lcm
题意,求:
不多说废话,直接开推:
我们发现这个 实际上还是枚举的 ,那我们来直接替换:
那么后边这个 实际上就是小于 且与 互质的数的和,这玩意就等于 ,证明如下:
由于更相减损法 可知,所有与 互质的数都是成对出现的,每一对的和为 ,一共有 对,那么和为 ,当然要在 的条件下满足。
那么原式即变为:
但是如果 上式变为 ,就不成立了,因此 的时候特判一下就好。
容易发现这是一个 的算法,优化一下,设 ,也就是 ,它显然是个积性函数,那可以考虑用个筛子筛一下,很容易将复杂度降到 级别。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int n,T;
int prim[N],phi[N],f[N];
void init(){
phi[1]=1;
for(int i=2;i<=N;++i){
if(!phi[i]) prim[++prim[0]]=i,phi[i]=i-1;
for(int j=1;j<=prim[0]&&i*prim[j]<=N;++j){
if(!(i%prim[j])){
phi[i*prim[j]]=prim[j]*phi[i];
break;
}else phi[i*prim[j]]=(prim[j]-1)*phi[i];
}
}
for(int i=1;i<=N;++i)
for(int j=i;j<=N;j+=i) f[j]+=(i==1)?1:(phi[i]*i/2);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
init();
cin>>T;
while(T-->0){
cin>>n;
cout<<f[n]*n<<'\n';
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?