• 【BZOJ】【2818】Gcd


    欧拉函数/莫比乌斯函数

      嗯……跟2190很像的一道题,在上道题的基础上我们很容易就想到先求出gcd(x,y)==1的组,然后再让x*=prime[i],y*=prime[i]这样它们的最大公约数就是prime[i]了……

      当然我们完全没必要这样做……对于每个prime[j],计算在(1,n/prime[j])范围内互质的数的对数,记为f[j],那么答案就等于sigma(f[j])

      f[j]的求法还是和以前一样啦~(sigma φ(i))*2+1  (加一是因为类似 5,5 这样两个质数它俩的GCD也是质数)

      UPD:这个由于$phi(i)$是积性函数,所以互质的对数是可以乘起来的……

    核心思想在于转化:即把【求(1,n)范围内gcd=prime的对数】转化为【求(1,n/prime)范围内gcd=1的对数】

    另外,最后结果会很大……需要用long long.

     1 /**************************************************************
     2     Problem: 2818
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:888 ms
     7     Memory:89164 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 2818
    11 #include<cstdio>
    12 #include<cstring>
    13 #include<cstdlib>
    14 #include<iostream>
    15 #include<algorithm>
    16 #define rep(i,n) for(int i=0;i<n;++i)
    17 #define F(i,j,n) for(int i=j;i<=n;++i)
    18 #define D(i,j,n) for(int i=j;i>=n;--i)
    19 using namespace std;
    20 int getint(){
    21     int v=0,sign=1; char ch=getchar();
    22     while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();}
    23     while(isdigit(ch))  {v=v*10+ch-'0'; ch=getchar();}
    24     return v*sign;
    25 }
    26 /*******************template********************/
    27 const int N=10000010;
    28 typedef long long LL;
    29 int prime[N],phi[N],tot=0;
    30 bool check[N];
    31 void getphi(int n){
    32     F(i,0,n) check[i]=0;
    33     phi[1]=0;
    34     F(i,2,n){
    35         if(!check[i]){
    36             prime[tot++]=i;
    37             phi[i]=i-1;
    38         }
    39         rep(j,n){
    40             if(i*prime[j]>n) break;
    41             check[i*prime[j]]=1;
    42             if(i%prime[j]==0){
    43                 phi[i*prime[j]]=phi[i]*prime[j];
    44                 break;
    45             }
    46             else phi[i*prime[j]]=phi[i]*(prime[j]-1);
    47         }
    48     }
    49 }
    50 int main(){
    51     int n=getint();
    52     getphi(n);
    53     LL ans=0;
    54     rep(j,tot){
    55         LL temp=0;
    56         F(i,1,n/prime[j]) temp+=phi[i];
    57         ans+=2*(LL)temp+1;
    58     }
    59     printf("%lld
    ",ans);
    60     return 0;
    61 }
    62 
    欧拉函数

    莫比乌斯函数版本的不会写……这里@一下iwtwiioi,大家可以去看他的代码……

    2818: Gcd

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 2275  Solved: 1027
    [Submit][Status][Discuss]

    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

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    生成器
    迭代器
    装饰器
    闭包函数
    函数对象
    函数
    文件
    字符编码
    基本的数据类型和内置方法02
    基本的数据类型和内置方法01
  • 原文地址:https://www.cnblogs.com/Tunix/p/4270780.html
Copyright © 2020-2023  润新知