A 题解
GCD
https://ac.nowcoder.com/acm/contest/7607/A
没思路的话可以先打个表,就能发现:
如果 为素数,
如果 能表示为 ,且 最小且为素数,
除以上情况,。
举个例子第二个情况。比如 ,那么此时 ,因为 是素数,且。
然后可以线筛出 内所有素数,是 个,那么对于每个素数枚举他的幂,如果枚举的幂还没有记录过答案,那么此时这个素数便是这个幂的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; }