zoukankan      html  css  js  c++  java
  • 数学:莫比乌斯反演-GCD计数

    Luogu3455:莫比乌斯反演进行GCD计数

    莫比乌斯反演就是用来解决这一类问题的,通常f函数是要求的那个,F函数是显然的

    这样利用F的结果就可以推出来f的结果

    在计算结果的时候整除分快儿一下就可以很快了

     1 #include<cstdio>
     2 #include<algorithm>
     3 using std::min;
     4 const int maxn=60005;
     5 int cnt;
     6 long long ans;
     7 bool vis[maxn];
     8 int mu[maxn],sum[maxn];
     9 long long prim[maxn];
    10 inline long long read()
    11 {
    12     long long x=0,f=1;char ch=getchar();
    13     while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
    14     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    15     return x*f;
    16 }
    17 void get_mu(long long x)
    18 {
    19     mu[1]=1;
    20     for(long long i=2;i<=x;i++)
    21     {
    22         if(!vis[i]){mu[i]=-1;prim[++cnt]=i;}
    23         for(long long j=1;j<=cnt&&i*prim[j]<=x;j++)
    24         {
    25             vis[i*prim[j]]=1;
    26             if(i%prim[j]==0) break;
    27             else mu[i*prim[j]]=-mu[i];
    28         }
    29     }
    30     for(long long i=1;i<=x;i++) sum[i]=sum[i-1]+mu[i];
    31 }
    32 inline void init()
    33 {
    34     ans=0;
    35 }
    36 int main()
    37 {
    38     int T;
    39     long long a,b,d,max_rep;
    40     T=read();
    41     get_mu(50000);
    42     while(T--)
    43     {
    44         init();
    45         a=read();b=read();d=read();
    46         max_rep=min(a/d,b/d);
    47         for(long long l=1,r;l<=max_rep;l=r+1)
    48         {
    49             r=min(a/(a/l),b/(b/l));
    50             ans+=(a/(l*d))*(b/(l*d))*(sum[r]-sum[l-1]);
    51         }
    52         printf("%lld
    ",ans);
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    cocoaPod
    Swift 命名规则
    Swift 数据类型
    Xcode Version 和Bulid 区别
    升级Xcode之后VVDocumenter-Xcode不能用的解决办法
    Mac svn
    RSA 加密
    想做AI测试,需要学习哪些数学知识?
    selenium + firefox驱动版本对应。
    开机自动启动WEB服务,共享目录。
  • 原文地址:https://www.cnblogs.com/aininot260/p/9702343.html
Copyright © 2011-2022 走看看