[题解]luogu P2257 YY的GCD

袁野的gcd

首先可以肯定的是这是一道数论题

所以题目就是: \(\sum_{i=1}^N \sum_{j=1}^M [gcd(i,j)\in prime]\)

接下来就可以愉快的推式子了~

首先可以按套路枚举 prime 和 gcd

\(\sum_{p \in prime}\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)=p]\)

所以我们显然可以将\(i\)和\(j\) 同时除以 \(p\),得到
\(\sum_{p\in prime}\sum_{i=1}^{N}\sum_{j=1}^{M}[gcd(\frac ip,\frac jp)=1]\)

即等价于
\(\sum_{p\in prime}\sum_{i=1}^{\frac Np}\sum_{j=1}^{\frac Mp} [gcd(i,j)=1]\)

到了这里,我们发现对于\([gcd(i,j)=1]\) 我们可以根据莫比乌斯函数的定义 \(\sum_{d\mid n}\mu(d)\ =[n=1]\) 来进行替换,即

\(\sum_{p \in prime}\sum_{i=1}^{\frac Np}\sum_{j=1}^{\frac Mp}\sum_{d\mid i,d\mid j} \mu(d)\)

我们可以按照套路将 \(d\) 提前,(这里我们默认\(N\le M\))

\(\sum_{p \in prime}\sum_{d=1}^{\frac Np}\mu(d)\sum_{i=1}^{\frac Np}[d\mid i]\sum_{j=1}^{\frac Mp}[d\mid j]\)

然后我们可以发现后面那两个 \(\sum\) 可以用整除分块搞,即

\(\sum_{p \in prime}\sum_{d=1}^{\frac Np}\mu(d)\lfloor\frac N{dp}\rfloor\lfloor\frac M{dp}\rfloor\)

此时,我们应用一个小技巧,将上式中的\(dp\)换成\(Q\)(或称刘琛薛坷佳崔家贺):

\(\sum_{Q=1}^N \sum_{p \in prime}\mu(\frac Qp)\lfloor\frac N{Q}\rfloor\lfloor\frac M{Q}\rfloor\)

对于 \(\sum_{p \in prime}\mu(\frac Qp)\lfloor\frac N{Q}\rfloor\lfloor\frac M{Q}\rfloor\) ,我们可以用线性筛进行预处理 ,即在筛出 \(\varphi\) 后枚举。所以在维护前缀和后就可以对于每一个询问 \(O(1)\) 回答啦~

\(\mathcal{Code:}\)

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 10000010
#define debug cout<<__LINE__<<" "<<__FUNCTION__<<"\n"
inline int read(){
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9'){ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x;
}
void put(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>=10) put(x/10);
    putchar((x%10)+48);
}
int prime[N>>2],n,m,cnt;
bool ispri[N];
int mu[N],num[N];
inline void pri(){
    register int i,j;
    for(i=2;i<=N-10;i++){
        if(!ispri[i]){
            prime[++cnt]=i;
            mu[i]=-1;
        }
        for(j=1;j<=cnt&&(i*prime[j]<=N-10);j++){
            if(i*prime[j]<=N-10) ispri[i*prime[j]]=1;
            if(i%prime[j]==0){
                break;
            }else{
                mu[i*prime[j]]=-mu[i];
            }
        }
    }
    int res;
    for(i=1;i<=cnt;i++){
        res=1;
        for(j=prime[i];j<=N-10;j+=prime[i],res++){
            num[j]+=mu[res];
        }
    }
    for(i=2;i<=N-10;i++) num[i]+=num[i-1];
}
signed main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    mu[1]=1;
    pri();
    int T=read(),l,r;
    long long ans = 0;
    while(T--){
        n=read();m=read();ans=0;
        if(n>m) swap(n,m);
        for(l=1,r;l<=n;l=r+1){
            r=min(n/(n/l),m/(m/l));
            ans+=(long long)(num[r]-num[l-1])*(n/l)*(m/l);
        }
        put(ans);putchar('\n');
    }
//  fclose(stdin);
//  fclose(stdout);
    return 0;
}

原文地址:https://www.cnblogs.com/end-of-mind/p/11515298.html

时间: 2024-11-07 07:46:46

[题解]luogu P2257 YY的GCD的相关文章

luogu P2257 YY的GCD

嘟嘟嘟 感觉这几道数论题都差不多,但这到明显是前几道的升级版. 推了一大顿只能得60分,不得不看题解. 各位看这老哥的题解吧 我就是推到他用\(T\)换掉\(kd\)之前,然后枚举\(T\)的.这个转换确实想不出来啊. 还有最后一句,最终的式子 \[\sum_{T = 1} ^ {n} \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor * \sum_{k | T} \mu(\frac{T}{k}) (k \in prime)\] 他把

P2257 YY的GCD(莫比乌斯反演)

P2257 YY的GCD luogu题解第一篇非常棒,当然你也可以point here(转) 正题因为题解写的太优秀所以没得补充 这里用了一个卡常技巧:循环展开 就是以代码长度为代价减少循环次数 实测快了15ms(一个点1.5ms....) (用了快读更慢???(大雾)但是register真有用) #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #define re

P2257 YY的GCD

P2257 YY的GCD 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 输入输出格式 输入格式: 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示N, M 输出格式: T行,每行一个整数表示第i组数据的结果 输入输出样例 输入样例#1: 复制 2 10 10 100 100 输出样例#1: 复制 30 2791

P2257 YY的GCD (莫比乌斯反演)

[题目链接] https://www.luogu.org/problemnew/show/P2257 // luogu-judger-enable-o2 /* ----------------------- [题解] https://www.luogu.org/blog/peng-ym/solution-p2257 [莫比乌斯反演] http://www.cnblogs.com/peng-ym/p/8647856.html [整除分块] http://www.cnblogs.com/peng-y

P2257 YY的GCD (莫比乌斯反演)

题意:求\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = prim]\] 题解:那就开始化式子吧!! \[f(d) = \sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = d]\] \[F(x) = \sum_{d|x} f(d) = \left \lfloor \frac{n}{x} \right \rfloor \left \lfloor \frac{m}{x} \right \rfloor\] \[f(d) = \sum_{d|

bzoj 2820 luogu 2257 yy的gcd (莫比乌斯反演)

题目大意:求$gcd(i,j)==k,i\in[1,n],j\in[1,m] ,k\in prime,n,m<=10^{7}$的有序数对个数,不超过10^{4}次询问 莫比乌斯反演入门题 为方便表述,由于n和m等价,以下内容均默认n<=m 题目让我们求:$\sum_{k=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k]$ 容易变形为:$\sum_{k=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{k} \righ

洛谷【P2257】YY的GCD

YY的GCD 原题链接 这应该是我做的第一道莫比乌斯反演的题目. 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 输入输出格式 输入格式: 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示N, M 输出格式: T行,每行一个整数表示第i组数据的结果 说明 T=10000,N, M <= 10000000 解

【BZOJ 2820】 YY的GCD

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 807  Solved: 404 [Submit][Status] Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 Input 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示

【BZOJ2820】YY的GCD(莫比乌斯反演)

[BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{d=1}^n[d\_is\_prime]\sum_{i=1}^{n/d}[\frac{n}{id}][\frac{m}{id}]\] 老套路了 令\(T=id\) \[ans=\sum_{T=1}^{n}[\frac{n}{T}][\frac{m}{T}]\sum_{d|T}[d\_is\_prim