Analysis: The number of sieve primes, then enumerated, is reversed by the MO, then the key is the Block acceleration (block acceleration in the previous article)
#include <cstdio>#include<cstring>#include<queue>#include<cstdlib>#include<algorithm>#include<vector>#include<cmath>using namespaceStd;typedefLong LongLL;Const intn=1e7+5;Const intinf=0x3f3f3f3f;BOOLVis[n];intprime[n],mu[n],cnt;voidGETMU () {mu[1] =1; for(intI=2; i<=n-5; i++) { if(!Vis[i]) {prime[++CNT] =i; Mu[i]= -1; } for(intj=1; j<=cnt&&i*prime[j]<=n-5; J + +) {vis[i*PRIME[J]] =1; if(I%prime[j]) mu[i*prime[j]] =-Mu[i]; Else{mu[i*PRIME[J]] =0; Break; } } }}intMain () {GETMU (); for(intI=1; i<=n-5; ++i) mu[i]+=mu[i-1]; intN; scanf ("%d",&N); LL ans=0; for(intI=1; i<=cnt&&prime[i]<=n;++i) { intl=n/Prime[i]; for(intk=1, j;k<=l;k=j+1) {J=l/(l/k); Ans+=1ll* (mu[j]-mu[k-1]) * (l/k) * (l/k); }} printf ("%lld\n", ans); return 0;}
View Code
BZOJ2818:GCD the inverse of the MO