BZOJ 2820 YY的GCD

    xiaoxiao2021-04-15  70

    Description

    神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必然不会了,于是向你来请教……多组输入

    Input

    第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M

    Output

    T行,每行一个整数表示第i组数据的结果

    Sample Input

    2 10 10 100 100

    Sample Output

    30 2791

    HINT

    T = 10000 N, M <= 10000000

    Source

    辣鸡反演,学不会啊。 #include<iostream> #include<cstdio> using namespace std; const int N=10000005; int L=10000000,T,n,m,tot,pri[N],miu[N],f[N]; bool mrk[N]; long long ans; void init() { miu[1]=1; for(int i=2;i<=L;i++) { if(!mrk[i]) pri[++tot]=i,miu[i]=-1; for(int j=1;j<=tot&&i*pri[j]<=L;j++) { mrk[i*pri[j]]=1; if(i%pri[j]==0) { miu[i*pri[j]]=0; break; } miu[i*pri[j]]=-miu[i]; } } for(int i=1;i<=tot;i++) for(int j=1;j*pri[i]<=L;j++) f[j*pri[i]]+=miu[j]; for(int i=1;i<=L;i++) f[i]+=f[i-1]; } int main() { init(); scanf("%d",&T); while(T--) { ans=0; scanf("%d%d",&n,&m); for(int i=1,nxt;i<=min(n,m);i=nxt+1) { nxt=min(n/(n/i),m/(m/i)); ans+=(long long)(n/i)*(m/i)*(f[nxt]-f[i-1]); } printf("%lld\n",ans); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-670950.html

    最新回复(0)