社区讨论
我与我的厌氧代码
P3911最小公倍数之和参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo21fni7
- 此快照首次捕获于
- 2023/10/23 06:26 2 年前
- 此快照最后确认于
- 2023/11/03 06:48 2 年前
RT

CPP

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=0;
for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+c-'0';
return f?x:(~(x-1));
}
int n,N;
namespace Sub1{
#define n N
int a[4560],ans;
inline int gcd(int a,int b){
if(a<b)swap(a,b);
return (!b)?a:gcd(b,a%b);
}
signed work(){
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
ans+=a[i]*a[j]/gcd(a[i],a[j]);
printf("%lld",ans);
}
#undef n
}
namespace Sub2{
int CNT[50010],g[50010],s[50010];
bool notprime[50010];
int prime[10000],cnt,mu[50010],ANS;
inline void getprime(int LIM){
notprime[1]=1,mu[1]=1;
for(int i=2;i<=LIM;++i){
if(!notprime[i])prime[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*prime[j]<=LIM;++j){
notprime[i*prime[j]]=1;
if(!(i%prime[j])){
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=mu[i]*mu[prime[j]];
}
}
}
signed work(){
for(int i=1,a;i<=N;++i){
CNT[a=read()]++;
n=max(n,a);
}
for(int i=1,res=0;i<=n;++i,res=0){
for(int j=1;j<=n/i;++j)
res+=CNT[j*i]*j;
g[i]=res*res;
}
getprime(50000);
for(int i=1;i<=n;++i)
for(int j=1;j<=n/i;++j)
s[i*j]+=mu[i]*i;
for(int i=1;i<=n;++i)ANS+=s[i]*g[i]*i;
cout<<ANS;
}
}
signed main(){
N=read();
if(N<=4500)Sub1::work();
else Sub2::work();
}
QAQ
回复
共 2 条回复,欢迎继续交流。
正在加载回复...