zoukankan      html  css  js  c++  java
  • 【BZOJ】【2820】YY的GCD

    莫比乌斯反演

      PoPoQQQ讲义第二题。

      暴力枚举每个质数,然后去更新它的倍数即可,那个g[x]看不懂就算了……

      为什么去掉了一个memset就不T了→_→……

     1 /**************************************************************
     2     Problem: 2820
     3     User: Tunix
     4     Language: C++
     5     Result: Accepted
     6     Time:4368 ms
     7     Memory:167304 kb
     8 ****************************************************************/
     9  
    10 //BZOJ 2820
    11 #include<cstdio>
    12 #include<cstdlib>
    13 #include<cstring>
    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  
    21 int getint(){
    22     int v=0,sign=1; char ch=getchar();
    23     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
    24     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
    25     return v*=sign;
    26 }
    27 /*******************tamplate********************/
    28 const int N=10001000;
    29 typedef long long LL;
    30 int mu[N],prime[N],g[N],sum[N];
    31 bool check[N];
    32  
    33 void getmu(){
    34     int tot=0;
    35     mu[1]=1;
    36     for(int i=2;i<N;i++){
    37         if (!check[i]){
    38             prime[tot++]=i;
    39             mu[i]=-1;
    40         }
    41         rep(j,tot){
    42             if(i*prime[j]>=N)break;
    43             check[i*prime[j]]=1;
    44             if(i%prime[j]==0){
    45                 mu[i*prime[j]]=0;
    46                 break;
    47             }
    48             else
    49                 mu[i*prime[j]]=-mu[i];
    50         }
    51     }
    52     rep(j,tot)
    53         for(int i=prime[j];i<N;i+=prime[j])
    54             sum[i]+=mu[i/prime[j]];//对于每个质数,枚举它的倍数 
    55     for(int i=1;i<N;i++) sum[i]+=sum[i-1];
    56 }
    57  
    58 int main(){
    59     getmu();
    60     int T=getint();
    61     LL ans;
    62     while(T--){
    63         int n=getint(),m=getint();
    64         if(n>m) swap(n,m);
    65         ans=0;
    66         for(int i=1,last;i<=n;i=last+1){
    67             last=min(n/(n/i),m/(m/i));
    68             ans+=(LL)(n/i)*(m/i)*(sum[last]-sum[i-1]);
    69         }
    70         printf("%lld
    ",ans);
    71     }
    72     return 0;
    73 }
    74 
    View Code

    2820: YY的GCD

    Time Limit: 10 Sec  Memory Limit: 512 MB
    Submit: 918  Solved: 467
    [Submit][Status][Discuss]

    Description

    神犇YY虐完数论后给傻×kAc出了一题
    给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对
    kAc这种傻×必然不会了,于是向你来请教……
    多组输入

    Input

    第一行一个整数T 表述数据组数
    接下来T行,每行两个正整数,表示N, M

    Output

    T行,每行一个整数表示第i组数据的结果

    Sample Input

    2
    10 10
    100 100

    Sample Output

    30
    2791

    HINT

    T = 10000

    N, M <= 10000000

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    [Bzoj2243][SDOI2011]染色(线段树&&树剖||LCT)
    [poj3074]Sudoku(舞蹈链)
    [Bzoj1047][HAOI2007]理想的正方形(ST表)
    [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
    [Bzoj2431][HAOI2009]逆序对数列(前缀和优化dp)
    [Bzoj1072][SCOI2007]排列perm(状压dp)
    [Bzoj1195][HNOI2006]最短母串(AC自动机)
    Ajax解决IE浏览器兼容问题
    运行eclipse弹出“Failed to load the JNI shared”解决方法
    Java表单类双击提交
  • 原文地址:https://www.cnblogs.com/Tunix/p/4294228.html
Copyright © 2011-2022 走看看