思路:
打表。
利用公式。
类似素数打表一样。
#include<bits/stdc++.h> using namespace std; const int N=3e6+10; bool isPrime[N]; long long res[N]; void init() { res[1]=1; memset(isPrime,true,sizeof(isPrime)); for(long long i=2;i<=3000000;i++) res[i]=i; for(long long i=2;i<=3000000;i++) { if(!isPrime[i]) continue; res[i]=res[i]*(i-1)/i; for(long long j=i+i;j<=3000000;j+=i) { isPrime[j]=false; res[j]=res[j]*(i-1)/i; } } for(int i=2;i<=3000000;i++) res[i]+=res[i-1]; } int main() { init(); int a,b; while(~scanf("%d%d",&a,&b)) printf("%lld ",res[b]-res[a-1]); return 0; }