zoukankan      html  css  js  c++  java
  • 解题:洛谷2257 YY的GCD

    题面

    初见莫比乌斯反演

    有一个套路是关于GCD的反演经常设$f(d)=sum_{gcd(i,j)==d},g(d)=sum_{d|gcd(i,j)}$,然后推推推

    $sumlimits_{i=1}^nsumlimits_{j=1}^m[gcd(i,j)==prime]$

    $sum_{p∈prime}f(p)$

    $sum_{p∈prime} sum_{d=1}^{min(n,m)} [p|d] μ(frac{d}{p})g(d)$

    套路的,改为枚举$frac{d}{p}$

    $sum_{p∈prime} sum_{d=1}^{min(leftlfloorfrac{n}{p} ight floor,leftlfloorfrac{m}{p} ight floor)}μ(d)g(dp)$

    这时候可以换掉$g$了

    $sum_{p∈prime} sum_{d=1}^{min(leftlfloorfrac{n}{p} ight floor,leftlfloorfrac{m}{p} ight floor)}μ(d)leftlfloorfrac{n}{dp} ight floorleftlfloorfrac{m}{dp} ight floor$

    然后换回枚举现在的$dp$(即原来的$d$),交换求和号

    $sumlimits_{i=1}^{min(n,m)}sum_{d|i&&d∈prime}μ(frac{i}{d})leftlfloorfrac{n}{i} ight floorleftlfloorfrac{m}{i} ight floor$

    $sumlimits_{i=1}^{min(n,m)}leftlfloorfrac{n}{i} ight floorleftlfloorfrac{m}{i} ight floorsum_{d|i&&d∈prime}μ(frac{i}{d})$

    于是数论分块,前面的直接算,后面的线性筛之后$O(nlog n)$预处理一下再做个前缀和

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=10000005;
     6 int npr[N],pri[N],mul[N];
     7 long long mulsum[N],ans;
     8 int T,n,m,nm,cnt,maxx;
     9 void prework()
    10 {
    11     register int i,j;
    12     mul[1]=1,npr[1]=true,maxx=10000000;
    13     for(i=2;i<=maxx;i++)
    14     {
    15         if(!npr[i]) pri[++cnt]=i,mul[i]=-1;
    16         for(j=1;j<=cnt&&1ll*i*pri[j]<=maxx;j++)
    17         {
    18             npr[i*pri[j]]=true;
    19             if(i%pri[j]==0) break;
    20             else mul[i*pri[j]]=-mul[i];
    21         }
    22     }
    23     for(i=1;i<=maxx;i++)
    24         for(j=1;j<=cnt&&1ll*i*pri[j]<=maxx;j++)
    25             mulsum[i*pri[j]]+=mul[i];
    26     for(i=1;i<=maxx;i++) mulsum[i]+=mulsum[i-1];
    27 }
    28 int main()
    29 {
    30     register int i,j;
    31     scanf("%d",&T),prework();
    32     while(T--)
    33     {
    34         scanf("%d%d",&n,&m),ans=0,nm=min(n,m);
    35         for(i=1;i<=nm;i=j+1)
    36         {
    37             j=min(n/(n/i),m/(m/i));
    38             ans+=(mulsum[j]-mulsum[i-1])*(n/i)*(m/i);
    39         }
    40         printf("%lld
    ",ans);
    41     }
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    Dom修改元素样式
    URL百分号编码
    accesskey附上一些实例
    dom实例
    dom 创建时间
    关系运算符
    赋值运算符
    js图片随机切换
    js自增图片切换
    transform-origin盒子旋转位置
  • 原文地址:https://www.cnblogs.com/ydnhaha/p/10116461.html
Copyright © 2011-2022 走看看