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



京公网安备 11010502036488号