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,但是 CF 机子跑了 5 s。
今天早上说出现了技术问题,不知道是什么。