题目的意思:
求总和n以下所有LCM的和
这是一个先线性筛。
然后就是多重背包了。
因为对于一串数的LCM是一个质数最高幂之积。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define N 2000*100
long long prime[N]={0};
long long vis[N]={0};
long long f[N]={0};
long long cnt=0;
long long n;
int main(){
cin>>n;
for(long long i=2;i<=n*10;i++){
if(vis[i]==0){
cnt++;
prime[cnt]=i;
}
for(long long j=1;j<=cnt&&prime[j]*i<=10*n;j++){
vis[prime[j]*i]=1;
if(i%prime[j]==0){
break;
}
}
}
// cout<<"wokring"<<endl;
f[0]=1;
for(long long i=1;i<=cnt;i++){
for(long long j=n;j>=prime[i];j--){
for(long long k=prime[i];k<=n;k*=prime[i]){
// cout<<i<<" "<<j<<" "<<k<<endl;
f[j]+=f[j-k];
}
}
}
long long ans=0;
for(long long i=0;i<=n;i++){
ans+=f[i];
}
cout<<ans;
}

本文介绍了一种求解小于等于n的所有数的最小公倍数(LCM)之和的算法实现。通过线性筛法获取质数,并利用多重背包问题的思想进行计算。文章包含完整的C++代码实现。
337

被折叠的 条评论
为什么被折叠?



