「Luogu2257」YY的GCD

「Luogu2257」YY的GCD

蒟蒻的第一道莫反

跟着题解推的式子,但还是记录一下过程吧

本文可能在一定程度上存在谬误,请谨慎分析

若发现文中有错误,如您愿意,恳请您向我指出,不胜感激



problem

Solution

题目要求:

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

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

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

于是有

\[g(n)=\sum_{n|d}f(d)\]

反演后可得

\[f(n)=\sum_{n|d}\mu(\frac{d}{n})g(d)\]

又知\(g(d)=\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\)

于是有

\[ans=\sum_{n\in prime}f(n)=\sum_{n\in prime}\sum_{n|d}\mu (\frac{d}{n})\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\\=\sum_{n|d}\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\sum_{n\in prime}\mu(\frac{d}{n})\\=\sum_{d=1}^{min(N,M)}\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\sum_{n|d,n\in prime}\mu(\frac{d}{n})\]

令\(sum(d)=\sum_{n|d,n\in prime}\mu(\frac{d}{n})\),预处理\(sum(d)\)

那么答案即

\[ans=\sum_{d=1}^{min(M,N)}\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor sum(d)\]

\(\sum sum(d)\)仍可以利用前缀和优化,\(\sum\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\)利用整除分块优化,最终时间复杂度为\(O(T\sqrt{min(N,M)}+k)\),\(k\)为预处理复杂度

Code

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define maxn 10000005
#define N 10000000
using namespace std;
typedef long long ll;

template <typename T> void read(T &t)
{
    t=0;int f=0;char c=getchar();
    while(!isdigit(c)){f|=c=='-';c=getchar();}
    while(isdigit(c)){t=t*10+c-'0';c=getchar();}
    if(f)t=-t;
}

int T;
int n,m;
int pri[maxn],pcnt,nop[maxn];
int mu[maxn];
ll sum[maxn],up;

void GetPrime()
{
    nop[1]=1,mu[1]=1;
    for(register int i=2;i<=N;++i)
    {
        if(!nop[i])pri[++pcnt]=i,mu[i]=-1;
        for(register int j=1;j<=pcnt && i*pri[j]<=N;++j)
        {
            nop[i*pri[j]]=1;
            if(i%pri[j]==0)break;
            else mu[i*pri[j]]=-mu[i];
        }
    }
    for(register int i=1;i<=pcnt;++i)
        for(register int j=1;pri[i]*j<=N;++j)
            sum[pri[i]*j]+=mu[j];
    for(register int i=1;i<=N;++i)
        sum[i]+=sum[i-1];
}

ll Calc()
{
    ll re=0;
    for(register int l=1,r;l<=up;l=r+1)
    {
        r=min(n/(n/l),m/(m/l));
        re+=1ll*(n/l)*(m/l)*(sum[r]-sum[l-1]);
    }
    return re;
}

int main()
{
    read(T);
    GetPrime();
    while(T--)
    {
        read(n),read(m);
        up=min(n,m);
        printf("%lld\n",Calc());
    }
    return 0;
}

原文地址:https://www.cnblogs.com/lizbaka/p/10508947.html

时间: 2024-07-30 22:22:32

「Luogu2257」YY的GCD的相关文章

YY的GCD【莫比乌斯反演】

[Luogu2257]YY的GCD 求\(\sum_{i=1}^n\sum_{j=1}^m[(x, y)\)为质数\(]\) \(T \le {10}^4, 1\le n, m \le {10}^7\) 假设\(p\)为\(M\)以内的质数 \[\begin{aligned}ans&=\sum_{p\in prime}\sum_{i=1}^n\sum_{j=1}^m[(i, j) == p]\&=\sum_{p\in prime}\sum_{x=1}^{\lfloor\frac{n}{p}

「Luogu2221」[HAOI2012]高速公路

「Luogu2221」[HAOI2012]高速公路 problem 题目描述 \(Y901\)高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. \(Y901\)高速公路是一条由\(N-1\)段路以及\(N\)个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为\(1\)~\(N\),从收费站\(i\)行驶到\(i+1\)(或从\(i+1\)行驶到\(i\))需要收取\(V_i\)的费用.高速路刚建成时所有的

「WC2016」论战捆竹竿

「WC2016」论战捆竹竿 前置知识 参考资料:<论战捆竹竿解题报告-王鉴浩>,<字符串算法选讲-金策>. Border&Period 若前缀 \(pre(s,x)?\) 与后缀 \(suf(s,n-x-1)?\) 相等,则 \(pre(s, x)?\) 是 \(s?\) 的一个 \(\text{Border}?\). \(x?\) 是 \(s?\) 的一个周期 (\(\text{Preiod}?\)) 满足 \(s[i]=s[i+x],\forall{1\leq i\le

「Luogu2522」[HAOI2011]Problem b

「Luogu2522」[HAOI2011]Problem b problem Solution 题目要求 \[\sum_{x=a}^b\sum_{y=c}^d[gcd(x,y)=k]\] 设上式为\(Ans(a,b,c,d,k)\) 不妨来想一想\(a=1,c=1\)的时候怎么做 其实就跟「Luogu3455」[POI2007]ZAP-Queries一模一样了 略过一大堆式子,当\(a=c=1\)时 \[Ans(1,b,1,d,k)=\sum_{t=1}^{\frac{min(b,d)}{k}}

「CQOI2015」选数

「CQOI2015」选数 题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简单,小z会告诉你一个整数K,你需要回答他最大公约数刚好为K的选取方案有多少个.由于方案数较大,你只需要输出其除以1000000007的余数即可. 输入输出格式 输入格式: 输入一行,包含4个空格分开的正整数,

「题解」kuangbin 最小生成树

POJ-1251 Jungle Roads (水题,%c) POJ-1287 Networking (水) POJ-2031 Building a Space Station (%f浮点数尴尬精度,两球间距离) POJ-2421 Constructing Roads (一些边已建好,简单处理一下) ZOJ-1586 QS Network (处理一下边权) HDU-1233 还是畅通工程 (水) HDU-1875 畅通工程再续 (浮点数,条件连边) HDU-1301 Jungle Roads (重

「题解」「美团 CodeM 资格赛」跳格子

目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞定,最后无奈 \(90pts\) . 然而 \(T2\) 想到很多很奇怪的做法,结果正解在 \(28min\) 之内做出... 结果 \(T3\) 是本人最不擅长的伪期望,直接跳过,啥都没得. 来水一发 \(T1\) 的题解... 题目描述 点这里 考场思路 其实并没有什么十分特别的思路,就是一通乱

AC日记——「HNOI2017」单旋 LiBreOJ 2018

#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxtree maxn<<2 int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree]; int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn]

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知