题意
求 ∑Ri=Lμ(i) , L,R≤1011
题解
杜教筛模板题。
g(1)S(n)=∑i=1n(f∗g)(i)−∑i=2ng(i)S(⌊ni⌋)
μ∗1=ϵ , g 取常数函数
S(n)=∑i=1n−∑i=2ng(i)S(⌊ni⌋)
#include<cstdio>
#include<map>
#include<cstring>
#include<algorithm>
#include <tr1/unordered_map>
using namespace std;
using namespace std::tr1;
const int maxn=10000005, N=10000000;
typedef long long LL;
int Q,p[maxn],mu[maxn];
bool vis[maxn];
void get_mu(){
memset(vis,1,sizeof(vis));
mu[1]=1;
for(int i=2;i<=N;i++){
if(vis[i]) p[++p[0]]=i, mu[i]=-1;
for(int j=1;j<=p[0]&&p[j]*i<=N;j++){
vis[p[j]*i]=false;
if(i%p[j]==0){ mu[p[j]*i]=0; break; }
mu[p[j]*i]=-mu[i];
}
}
for(int i=1;i<=N;i++) mu[i]+=mu[i-1];
}
unordered_map< LL, int > lst;
int Sum(LL n){
if(n<=N) return mu[n];
if(lst.find(n)!=lst.end()) return lst[n];
int res=1;
for(LL i=2,nxt;i<=n;i=nxt+1){
nxt=n/(n/i);
res-=Sum(n/i)*(nxt-i+1);
}
return lst[n]=res;
}
int main(){
freopen("51nod1244.in","r",stdin);
freopen("51nod1244.out","w",stdout);
get_mu();
LL L,R; scanf("%lld%lld",&L,&R);
printf("%d\n",Sum(R)-Sum(L-1));
return 0;
}