zoukankan      html  css  js  c++  java
  • BZOJ 2818GCD

    Description

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
    数对(x,y)有多少对.

    Input

    一个整数N

    Output

    如题

    Sample Input

    4

    Sample Output

    4

    HINT

    hint

    对于样例(2,2),(2,4),(3,3),(4,2)


    1<=N<=10^7

    题解


    gcd(a,b)=p 则 gcd(a/p,b/p)=1;

    设 a<=b 则gcd(a,b)=phi[b](与b互质的个数)

    所以只需要枚举每一个素数,每一个数(这里可以用n的前缀和来维护,记为f[n])求解出ans=Σf[n/prime[i]]*2-1(考虑a>b,并减去(1,1)之类的值)

     1 #include<cstdio>
     2 const int maxn=10000010;
     3 bool pd[maxn];
     4 long long phi[maxn],prime[maxn],top,n,ans;
     5 void ES(){
     6     for(int i=2;i<n;i++){
     7         if (!pd[i]){
     8             prime[++top]=i;
     9             phi[i]=i-1;
    10         }
    11         for (int j=1;j<=top&&prime[j]*i<=n;j++){
    12             pd[prime[j]*i]=1;
    13             if (i%prime[j]==0){
    14                 phi[prime[j]*i]=phi[i]*prime[j];
    15                 break;
    16             }
    17             phi[prime[j]*i]=phi[i]*(prime[j]-1);
    18         }
    19     } 
    20 }
    21 
    22 int main(){
    23     scanf("%lld",&n);
    24     ES();
    25     for(int i=1;i<n;i++) phi[i]+=phi[i-1];
    26     for (int i=1;i<=top;i++) ans+=phi[n/prime[i]]*2+1;
    27     printf("%lld",ans);
    28 }
  • 相关阅读:
    最小树形图 朱刘算法模板+建边技巧
    模板倍增LCA 求树上两点距离 hdu2586
    【瞎搞题】gym226123 L. For the Honest Election
    【凸包板题】Gym
    集合3
    集合2
    集合1
    常用API&异常
    内部类&API
    多态&接口类&接口
  • 原文地址:https://www.cnblogs.com/wuminyan/p/5116145.html
Copyright © 2011-2022 走看看