zoukankan      html  css  js  c++  java
  • 1101: [POI2007]Zap

    Description

      FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a
    ,y<=b,并且gcd(x,y)=d。作为FGD的同学,FGD希望得到你的帮助。


    [ans=sum_{i=1}^{a}sum_{j=1}^{b}[gcd(i,j)=d] ]

    反演一波

    [ans=sum_{i=1}^{a}sum_{j=1}^{b}sum_{k|i wedge k|j}mu(k) ]

    (k)提前

    [ans=sum_{k=1}^{min(a,b)}mu(k)lfloorfrac{a}{dk} floorlfloorfrac{b}{dk} floor ]

    没啦


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define M 50001
    #define R register
    #define swap(a,b) c=a,a=b,b=c;
    //#define gc getchar
    using namespace std;
     
    int m,n,k,p[M],mu[M],b[M],cnt,t,ans,c;
    int v[M][3],maxx;
     
    inline void ptt(int x)
    {
        R int s[20]={0};
        while(x) s[++s[0]]=x%10, x/=10;
        for(R int i=s[0];i;i--) putchar(s[i]+'0');
        if(!s[0]) putchar('0');
        putchar(10);
    }
     
    inline char gc()
    {
        static char now[1<<22],*S,*T;
        if (T==S)
        {
            T=(S=now)+fread(now,1,1<<22,stdin);
            if (T==S) return EOF;
        }
        return *S++;
    }
    inline int read()
    {
        register int x=0,f=1;
        register char ch=gc();
        while(!isdigit(ch))
        {
            if (ch=='-') f=-1;
            ch=gc();
        }
        while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=gc();
        return x*f;
    }
     
    inline int min(int a,int b)
    {
        if(a<b) return a;
        return b;
    }
     
    void Muu(int N)
    {
        mu[1]=1;
        for(R int i=2;i<N;i++)
        {
            if(!b[i]) mu[i]=-1, p[++cnt]=i;
            for(R int j=1;j<=cnt && p[j]*i<N;j++)
            {
                b[p[j]*i]=1; if(i%p[j]==0) break;
                mu[p[j]*i]=-mu[i];
            }
        }
        for(int i=2;i<N;i++) mu[i]+=mu[i-1];
    }
     
    int main()
    {
        t=read();
        for(int i=1;i<=t;i++) 
        {
            v[i][0]=read(), v[i][1]=read(), v[i][2]=read();
            maxx=max(maxx,min(v[i][0],v[i][0]));
        }
        Muu(maxx+1);
        for(R int i=1;i<=t;i++)
        {
            n=v[i][0], m=v[i][1], k=v[i][2];
            if(n>m) swap(n,m); ans=0; n/=k, m/=k;
            for(R int l=1,r;l<=n;l=r+1)
            {
                r=min(n/(n/l),m/(m/l));
                ans+=(n/l)*(m/l)*(mu[r]-mu[l-1]);
            }
            ptt(ans);
        }
    }
    
  • 相关阅读:
    2017第10周日
    关于能聊
    mybatis的$存在安全问题,为什么又不得不用?
    Cassandra的登录认证授权
    elasticsearch安装过程中的license问题解决办法
    配置ModSecurity防火墙与OWASP规则
    apache安装php7过程中遇到到段错误
    mac下apache启动关闭操作
    mac下firefox复制粘贴失效解决办法
    firefox和chrome对于favicon.ico关于content-security-policy的不同处理
  • 原文地址:https://www.cnblogs.com/ZUTTER/p/10238783.html
Copyright © 2011-2022 走看看