站外题求助
  • 板块学术版
  • 楼主zhongcy
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/5 12:41
  • 上次更新2023/10/27 08:43:25
查看原帖
站外题求助
202474
zhongcy楼主2022/10/5 12:41

原题是求EKG序列。求助下面代码的时间复杂度和优化到 O(nlog2n)\mathcal{O}(n\log^2n) 及以下的方法。

#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;
}
2022/10/5 12:41
加载中...