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)\lfloor\frac{a}{dk}\rfloor\lfloor\frac{b}{dk}\rfloor \]

没啦


#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);
    }
}

猜你喜欢

转载自www.cnblogs.com/ZUTTER/p/10238783.html