2020牛客NOIP赛前集训营-提高组(第二场)AGCD

it2025-03-05  26

题目

传送门

题目描述

我们定义 f ( x ) = g c d f(x) = gcd f(x)=gcd ( x (x (x 1 1 1之外的所有因子 ) ) ) x x x 1 1 1外所有因子的 g c d gcd gcd 询问从 f ( a ) + f ( a + 1 ) + … … + f ( b ) f(a) + f(a+1) + …… + f(b) f(a)+f(a+1)++f(b)

输入描述

输入两个正整数 a , b a,b ab

输出描述

输出一个正整数表示答案

分析

不难找到如下规律:

x x x是质数,则 g c d ( x ) = x gcd(x)=x gcd(x)=x x x x k k k的正整数次幂( k k k为质数),则 g c d ( x ) = k gcd(x)=k gcd(x)=k x x x有两个及以上的质因数,则 g c d ( x ) = 1 gcd(x)=1 gcd(x)=1

于是很自然的,先把数据范围内所有质数筛一遍,然后用筛出来的质数对区间内每一个数进行操作即可 注意答案为 l o n g long long l o n g long long

代码

#include <bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e7; int l,r,num,P[maxn];ll ans; bool isP[maxn]; void Pr() { for(int i=2;i<=maxn;i++) { if(isP[i]) continue;P[++num]=i; for(int j=i+i;j<=maxn;j+=i) isP[j]=1; } } int main() { Pr(); scanf("%d%d",&l,&r); for(int i=l;i<=r;i++) { if(!isP[i]) { ans+=1ll*i; continue; }int ii=i; for(int j=1;j<=num&&P[j]<=ii;j++) { if(ii%P[j]==0) { while(ii%P[j]==0) ii/=P[j]; if(ii==1) ans+=1ll*P[j]; else ans+=1ll; break; } } } printf("%lld",ans); }

----原创文章,仅供参考

最新回复(0)