• [BZOJ2820]YY的GCD


    题目大意:
      对于给定的$n,m(n,mleq10^7)$,求$为质数displaystylesum_{x=1}^nsum_{y=1}^m[gcd(x,y)为质数]$。

    思路:
      设$p=gcd(x,y),x=ap,y=bp$,则:
    $$
    egin{align*}
    原式&=sum_{1leq pleqmin(n,m)且p为质数}sum_{a=1}^{lfloorfrac{n}{p} floor}sum_{b=1}^{lfloorfrac{m}{p} floor}[gcd(a,b)=1]\
    &=sum_{1leq pleqmin(n,m)且p为质数}sum_{a=1}^{lfloorfrac{n}{p} floor}sum_{b=1}^{lfloorfrac{m}{p} floor}sum_{d|gcd(a,b)}mu(d)\
    &=sum_{1leq pleqmin(n,m)且p为质数}sum_{p=1}^{lfloorfrac{min(n,m)}{p} floor}mu(p)sum_{a=1}^{lfloorfrac{n}{dp} floor}sum_{b=1}^{lfloorfrac{m}{dp} floor}1\
    &=sum_{1leq pleqmin(n,m)且p为质数}sum_{p=1}^{lfloorfrac{min(n,m)}{p} floor}mu(p)lfloorfrac{n}{dp} floorlfloorfrac{m}{dp} floor
    end{align*}
    $$
      令$k=dp$,则:
    $$
    egin{align*}
    原式&=sum_{k=1}^{min(n,m)}sum_{p为质数且p|k}mu(p)lfloorfrac{n}{k} floorlfloorfrac{m}{k} floor
    end{align*}
    $$
      其中$为质数且displaystylesum_{p为质数且p|k}mu(p)$可以预处理,$k$可以用数论分块枚举。

     1 #include<cstdio>
     2 #include<cctype>
     3 #include<algorithm>
     4 typedef long long int64;
     5 inline int getint() {
     6     register char ch;
     7     while(!isdigit(ch=getchar()));
     8     register int x=ch^'0';
     9     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    10     return x;
    11 }
    12 const int N=10000001,M=664580;
    13 bool vis[N];
    14 int mu[N],p[M];
    15 int64 sum[N];
    16 inline void sieve() {
    17     mu[1]=1;
    18     for(register int i=2;i<N;i++) {
    19         if(!vis[i]) {
    20             p[++p[0]]=i;
    21             mu[i]=-1;
    22         }
    23         for(register int j=1;j<=p[0]&&i*p[j]<N;j++) {
    24             vis[i*p[j]]=true;
    25             if(i%p[j]==0) {
    26                 mu[i*p[j]]=0;
    27                 break;
    28             }
    29             mu[i*p[j]]=-mu[i];
    30         }
    31     }
    32     for(register int i=1;i<=p[0];i++) {
    33         for(register int j=1;j*p[i]<N;j++) {
    34             sum[j*p[i]]+=mu[j];
    35         }
    36     }
    37     for(register int i=1;i<N;i++) {
    38         sum[i]+=sum[i-1];
    39     }
    40 }
    41 int main() {
    42     sieve();
    43     for(register int i=getint();i;i--) {
    44         const int n=getint(),m=getint(),lim=std::min(n,m);
    45         int64 ans=0;
    46         for(register int i=1,j;i<=lim;i=j+1) {
    47             j=std::min(n/(n/i),m/(m/i));
    48             ans+=(sum[j]-sum[i-1])*(n/i)*(m/i);
    49         }
    50         printf("%lld
    ",ans);
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    shell脚本学习001
    Discuz 代码分析 001 forum.php
    Oauth2.0 入门
    第一篇文章
    position的四个属性值: relative ,absolute ,fixed,static
    JQuery中stop([clearQueue],[goToEnd])介绍
    <meta>
    sublime 2中Package control安装和使用
    ios 状态码
    <video>和<audio>标签,对视频和音频的支持
  • 原文地址:https://www.cnblogs.com/skylee03/p/8464801.html
Copyright © 2020-2023  润新知