acwing 220. 最大公约数

@[toc]

题目:

给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。
GCD(x,y)即求x,y的最大公约数。

题解:

列出公式推导即可

在这里插入图片描述

代码:

#include<bits/stdc++.h>
#define MAXN 10000011
typedef long long ll;
using namespace std;
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
   return s*w;
}
bool vis[MAXN];
int pri[MAXN/10],cnt=0;
ll phi[MAXN];
void solve()
{
    phi[1]=1;vis[1]=1;
    for(ll i=2;i<MAXN;++i)
    {
        if(!vis[i])pri[++cnt]=i,phi[i]=i-1;
        for(ll j=1;j<=cnt&&i*pri[j]<MAXN;++j)
        {
            ll v=i*pri[j];
            vis[v]=1;
            if(i%pri[j]==0)
            {
                phi[v]=phi[i]*pri[j];break;
            }
            phi[v]=phi[i]*phi[pri[j]];
        }
    }
    for(ll i=1;i<MAXN;++i)phi[i]+=phi[i-1];
}
int main()
{
    solve();
    ll n=read(),ans=0;
    for(ll i=1;i<=cnt&&pri[i]<=n;++i)ans+=(2*phi[n/pri[i]]-1);
    printf("%lld",ans);
    return 0;
}
数论 文章被收录于专栏

数论方向

全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
牛客389580366号:读书的意义在于提升自己和他人吧,“阶级意识”是读书过程中的产出,“跨越阶级”是通过读书获得的能力
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务