题目链接:https://ac.nowcoder.com/acm/contest/7607/A
题意:定义f(x)=gcd(x除1外的所有因子),给定a,b。求f(a)+f(a+1)+...+f(b)
题解:对于任意的f(x),若x的质因子有超过一种,那么因为质因子互质,所以f(x)=1.
若质因子只有一个,那么f(x)=这个质因子。
所以我们只要对所有质因数幂次数进行标记就行。
a,b<=1e7 故做一遍质数筛后再标记一下1e7内的数就行。总时间在1e7左右。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll rd(){
    ll x=0;char o,f=1;
    while(o=getchar(),o<48)if(o==45)f=-f;
    do x=(x<<3)+(x<<1)+(o^48);
    while(o=getchar(),o>47);
    return x*f;
}
const int maxn=1e3+5;
const int M=1e7+5;
int pre[M],prime[M],tot;
void init(){
    for (int i=2;i<M;i++){
        if (pre[i]==0)prime[++tot]=pre[i]=i;
        for (int j=1;j<=tot;j++){
            int t=i*prime[j];
            if (t>=M)break;
            pre[t]=prime[j];
            if (i%prime[j]==0)break;
        }
    }
}
int vis[M];
int a,b;
int main() {
    init();
    for (int i=1;i<=tot;i++){
        for (ll now=prime[i];now<M;now*=prime[i])
            vis[now]=prime[i];
    }
    a=rd();b=rd();
    ll ans=0;
    for (int i=a;i<=b;i++){
        if (!vis[i])ans++;
        else ans+=vis[i];
    }
    cout<<ans<<endl;
    return 0;
}