NKOJ 3957 (BZOJ 2820)YY的GCD (莫比乌斯反演+线性筛)

本文解析了一道关于计算1<=x<=N,1<=y<=M且gcd(x,y)为质数的(x,y)有多少对的问题。通过数学推导,给出了线性筛处理的方法,并详细解释了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P3957YY的GCD

问题描述

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

输入格式

第一行一个整数T 表述数据组数

接下来T行,每行两个正整数,表示N, M

输出格式

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

样例输入

2
10 10
100 100

样例输出

30
2791

提示

T = 10000

N, M <= 10000000


显然Ans=min(n,m)pni=1mj=1[gcd(i,j)==p]pAns=∑pmin(n,m)∑i=1n∑j=1m[gcd(i,j)==p],p为质数

f(p)=i=1nj=1m[gcd(i,j)==p],F(p)=i=1nj=1m[p|gcd(i,j)]令f(p)=∑i=1n∑j=1m[gcd(i,j)==p],F(p)=∑i=1n∑j=1m[p|gcd(i,j)]

N=min(n,m)F(p)=p|kNf(k)=npmp令N=min(n,m),那么F(p)=∑p|kNf(k)=⌊np⌋⌊mp⌋

f(p)=p|kNμ(kp)F(k)=p|kNμ(kp)nkmk反演一下,f(p)=∑p|kNμ(kp)F(k)=∑p|kNμ(kp)⌊nk⌋⌊mk⌋

Ans=pNf(p)=pNp|kNμ(kp)nkmk那么Ans=∑pNf(p)=∑pN∑p|kNμ(kp)⌊nk⌋⌊mk⌋

如果是单组询问,到这里已经可以了,但本题有多组询问,因此
Ans=k=1Nnkmkp|kμ(kp)p交换一下枚举顺序,Ans=∑k=1N⌊nk⌋⌊mk⌋∑p|kμ(kp),p为质数

后面的部分可以直接枚举质数再枚举倍数预处理,复杂度接近O(n)O(n)
但显然可以线性筛处理,令其为g[i]g[i],当p[j]|ip[j]|i时,g[ip[j]]=μ(i)g[i∗p[j]]=μ(i),否则g[ip[j]]=mu[i]g[i]g[i∗p[j]]=mu[i]−g[i]
然后分块处理即可,复杂度O(n+Tn)O(n+Tn)

代码:

#include<stdio.h>
#include<algorithm>
#define N 10000005
#define ll long long
using namespace std;
ll T,P[N],tot,mu[N],g[N];
bool mark[N];
void EU()
{
    ll i,j;mu[1]=1;g[1]=0;
    for(i=2;i<N;i++)
    {
        if(!mark[i])P[++tot]=i,mu[i]=-1,g[i]=1;
        for(j=1;j<=tot&&i*P[j]<N;j++)
        if(i%P[j])mu[i*P[j]]=-mu[i],g[i*P[j]]=mu[i]-g[i],mark[i*P[j]]=1;
        else {mu[i*P[j]]=0;g[i*P[j]]=mu[i];mark[i*P[j]]=1;break;}
    }
    for(i=2;i<N;i++)g[i]+=g[i-1];
}
int main()
{
    ll n,m,i,j,ans;
    scanf("%lld",&T);EU();
    while(T--)
    {
        scanf("%lld%lld",&n,&m);ans=0;
        for(i=1;i<=n&&i<=m;i=j+1)
        {
            j=min(n/(n/i),m/(m/i));
            ans+=(n/i)*(m/i)*(g[j]-g[i-1]);
        }
        printf("%lld\n",ans);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值