不懂就问
  • 板块灌水区
  • 楼主PurslaneM2GA
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/28 16:14
  • 上次更新2024/6/28 19:23:09
查看原帖
不懂就问
120947
PurslaneM2GA楼主2024/6/28 16:14

CF 评测机发生了什么。

#include<bits/stdc++.h>
#define ll long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=1e7+10;
int n,flg[MAXN],mu[MAXN],lstp[MAXN],phi[MAXN];
vector<int> pr;
void init(int mx) {
    phi[1]=1,mu[1]=1;
    ffor(i,2,mx) {
        if(!flg[i]) mu[i]=-1,phi[i]=i-1,lstp[i]=i,pr.push_back(i);
        for(auto v:pr) {
            if(i*v>mx) break ;
            flg[i*v]=1,lstp[i*v]=v;
            if(i%v==0) {phi[i*v]=phi[i]*v;break ;}
            phi[i*v]=phi[i]*(v-1),mu[i*v]=-mu[i];
        }
    }
    return ;
}
int cnt[MAXN],pre[MAXN];
ll solve(int d) {
	if(n/d==1) return 0;
    ffor(i,1,n/d) cnt[lstp[i*d]]++;
    vector<pair<int,int>> vc;
    for(auto id:pr) {
        if(id*2<=n&&cnt[id]) vc.push_back({id,cnt[id]});
        else break;
    }
    if(vc.empty()||vc[vc.size()-1].first<lstp[d]) vc.push_back({lstp[d],cnt[lstp[d]]});
    int l=0,r=vc.size()-1;
    ll ans=0;
    pre[0]=vc[0].second;
    ffor(i,1,r) pre[i]=pre[i-1]+vc[i].second;
    ffor(i,0,vc.size()-1) {
        while(r>=0&&1ll*vc[i].first*vc[r].first>n) r--;
        if(r<=i) break ;
        ans+=1ll*vc[i].second*(pre[r]-pre[i]);
    }
    ffor(i,1,n/d) cnt[lstp[i*d]]=0;
	ll cnt=0; ffor(i,0,vc.size()-1) cnt+=vc[i].second;
	cnt*=cnt;
    ffor(i,0,vc.size()-1) cnt-=1ll*vc[i].second*vc[i].second;
	return ans*2+(cnt/2-ans)*3;
}
int main() {
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n,init(n);
    ll ans=0;
    ffor(i,1,n) if(mu[i]) ans+=mu[i]*solve(i);
	ffor(i,2,n) ans+=i-1-phi[i];
    cout<<ans;
    return 0;
}

这一份代码,在洛谷 IDE 和本机用时都 ≤1s\le 1 \rm s,但是 CF 机子跑了 5 s5 \rm \ s。

今天早上说出现了技术问题,不知道是什么。

2024/6/28 16:14
加载中...