题目链接: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; }