传送门
题解:
直接用min_25求 f ( p ) = p f(p)=p f(p)=p在所有素数处的点值之和就行了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
using std::cerr;
using std::cout;
cs int N=1e6+7;
cs double eps=1e-10;
inline double sumf(double x){return x*(x+1)*0.5;}
int lim;
double f1[N],f2[N];
inline double calc(ll n){
if(!n)return 0;
lim=sqrt(n);
for(int re i=1;i<=lim;++i)f1[i]=sumf(i),f2[i]=sumf(n/i);
for(int re p=2;p<=lim;++p){
if(fabs(f1[p]-f1[p-1])<=eps)continue;
double t=f1[p-1];
for(int re i=1,li=lim/p;i<=li;++i)f2[i]-=(f2[i*p]-t)*p;
for(int re i=lim/p+1,li=std::min(n/p/p,(ll)lim);i<=li;++i)f2[i]-=(f1[n/i/p]-t)*p;
for(int re i=lim;i>=(ll)p*p;--i)f1[i]-=(f1[i/p]-t)*p;
}
return f2[1];
}
ll l,r;
signed main(){
std::cin>>l>>r;
printf("%.0lf",calc(r)-calc(l-1));
return 0;
}