zoukankan      html  css  js  c++  java
  • BZOJ 2820 YY的GCD 莫比乌斯反演

    题意:链接

    方法:莫比乌斯反演

    解析:

    这题跟上一篇博客有一点差别,当然我们能够考虑枚举素数这个大暴力。只是当你A掉这道题后发现正解?都将近5s时。就放弃了这个念头。

    相同的式子我们能够直接搬过来。p是质数

    p1<=x<=a1<=y<=b(gcd(x,y)==p)

    p1<=x<=a/p1<=y<=b/p(gcd(x,y)==1)

    p1<=x<=a/p1<=y<=b/pd|(x,y)μ(d)

    pd=1min(a/p,b/p)μ(d)[apd][bpd]

    设pd=k

    k=1min(a,b)pp|kμ(kp)[apd][bpd]

    则设pp|kμ(kp)=F(k)

    发现F(k)的取值仅仅与选取的p与k的关系有关

    F(k)=μ(pdp1)

    当p|d时

    ①p=p1 F(k)=μ(d)

    ②p!=p1 F(k)=0

    F(k)=μ(d)

    当p不整除d时

    ①p=p1 F(k)=μ(d)

    ②p!=p1 F(k)=F(d)

    F(k)=μ(d)F(d)

    之后的内容和1101一样分块

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define N 10000010
    using namespace std;
    typedef long long ll;
    int tot,t;
    int a,b,d;
    int prime[N];
    bool f[N];
    int miu[N];
    ll g[N];
    void sieve()
    {
        miu[1]=1;
        for(int i=2;i<=10000000;i++)
        {
            if(!f[i])
            {
                prime[++t]=i;
                miu[i]=-1;
            }
            for(int j=1;j<=t&&i*prime[j]<=10000000;j++)
            {
                f[i*prime[j]]=1;
                if(i%prime[j]==0)
                {
                    miu[i*prime[j]]=0;
                    break;
                }else miu[i*prime[j]]=-miu[i];
            }
        }
        for(int i=1;i<=t;i++)
        {
            for(int j=1;j*prime[i]<=10000000;j++)
            {
                g[j*prime[i]]+=miu[j];
            }
        }
        for(int i=1;i<=10000000;i++)
        {
            g[i]+=g[i-1];
        }
    }
    int main()
    {
        sieve();
        scanf("%d",&tot);
        for(int i=1;i<=tot;i++)
        {
            scanf("%d%d",&a,&b);
            int a1=a,b1=b;
            int x=min(a1,b1);
            int pos;
            ll ans=0;
            for(int i=1;i<=x;i=pos+1)
            {
                pos=min((a1/(a1/i)),(b1/(b1/i)));
                ans+=(g[pos]-g[i-1])*(a1/i)*(b1/i);
            }
            printf("%lld
    ",ans);
        }
    }
  • 相关阅读:
    RabbitMQ消息队列
    集群概念
    重新学习CSS,认识CSS3中的属性
    计算机网络中,路由器和交换机的区别
    微信小程序中,如何点击链接跳转到外部网页
    微信小程序中,如何实现显示,隐藏密码的功能
    Vue 中引入echarts
    解决Ubuntu(linux)系统中PHP的curl函数无法使用的问题
    数据通信的基本知识
    计算机网络的性能
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7327523.html
Copyright © 2011-2022 走看看