原题是求EKG序列。求助下面代码的时间复杂度和优化到 O(nlog2n) 及以下的方法。
#include<bits/stdc++.h>
#define N 2100001
#define ll long long
#define inf 0x7fffffff
using namespace std;
ll n;
ll f[N];
bool phi[N];
ll prime[N],cnt;
ll c[N];
map<ll,ll>mp;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
memset(phi,true,sizeof(phi));
phi[1]=0;
for(int i=2;i<=N;i++)
{
if(phi[i])
prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
{
phi[i*prime[j]]=0;
if(i%prime[j]==0)
break;
}
}
f[1]=1;f[2]=2;
mp[0]=mp[1]=mp[2]=1;
for(int i=3;i<=n;i++)
{
ll t=f[i-1];
f[i]=inf;
for(int j=1;prime[j]<=t;j++)
if(t%prime[j]==0)
{
ll k=prime[j];
while(mp[c[k]])c[k]+=k;
f[i]=min(f[i],c[k]);
}
mp[f[i]]=1;
}
cout<<f[n];
return 0;
}