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);
        }
    }
    
  • 相关阅读:
    Linux strace 命令 说明
    存储区域网(SANStorage Area Network)
    RAC 中 ASM 实例名 与 节点的对应关系
    光纤通道(FC: Fibre Channel)
    Oracle expdp/impdp 使用示例
    RAC 中 ASM 实例名 与 节点的对应关系
    RAC 修改 DB 实例名 步骤
    InfiniBand 网络
    ORA09817: Write to audit file failed 解决方法
    RAC 安装patch 后启动实例 报错 ORA00439 feature not enabled Real Application Clusters 解决方法
  • 原文地址:https://www.cnblogs.com/ZUTTER/p/10238783.html
Copyright © 2011-2022 走看看