没思路的话可以先打个表,就能发现:
如果 为素数,
如果 能表示为 ,且 最小且为素数,
除以上情况,

举个例子第二个情况。比如 ,那么此时 ,因为 是素数,且

然后可以线筛出 内所有素数,是 个,那么对于每个素数枚举他的幂,如果枚举的幂还没有记录过答案,那么此时这个素数便是这个幂的f值。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long 
inline int read(){
     int x=0,f=0,ch=getchar();
    while('0'>ch||ch>'9')f^=ch=='-',ch=getchar();
    while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
    return f?-x:x;
}
const int MAX=1e7+5;
int vis[MAX],p[MAX],a,b,f[MAX],ans,x;
signed main(){
    for( int i=2;i<=MAX-5;++i){
        if(!vis[i])p[++p[0]]=i;
        for( int j=1,x;j<=p[0]&&(x=i*p[j])<=MAX-5;++j){
            vis[x]=1;
            if(i%p[j]==0)break;
        }
    }
    memset(f,-1,sizeof(f));
    for( int i=1;i<=p[0];++i){
        for( int x=p[i];x<=MAX-5;x=x*p[i]){
            if(f[x]==-1)f[x]=p[i];
        }
    }
    for( int i=1;i<=MAX-5;++i)if(f[i]==-1)f[i]=1;
    a=read(),b=read(); 
    for( int i=a;i<=b;++i)ans+=f[i];
    printf("%lld\n",ans);
    return 0;
}