这题美好体验就是卡常

Description

link

求

\[\sum^{n}_ {i=1} \sum^m_{j=1} [gcd(i,j)\in prime]
\]

其中:\(1\leq n,m \leq 10^7\),多组询问

Solution

对于这种与\(gcd\)相关的反演题,有一个好的套路

设\(f(d)=[gcd(i,j)=d]\),\(F(n)\)为\(gcd(i,j)=d\)和\(d\)的倍数的个数,即:

\[f(d)=[gcd(i,j)=d]
\]

\[F(n)=\sum_{d|n} f(d)= \lfloor \frac{N}{n} \rfloor \lfloor \frac{M}{m} \rfloor
\]

\[f(n)=\sum_{n|d} \mu(\lfloor \frac{d}{n} \rfloor)F(d)
\]

由着这个套路,我们开始化简这个式子

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

将\(f(p)\)带入:

\[\sum_{p \in prime}f(p)
\]

把\(f(x)\)换成\(F(x)\)

\[\sum_{p \in prime}\sum_{p|d} \mu(\lfloor \frac{d}{p} \rfloor)F(d)
\]

我们枚举\(\lfloor \frac{d}{p} \rfloor\)

\[\sum_{p \in prime} \sum_{d=1}^{min(\lfloor \frac{n}{p} \rfloor,\lfloor \frac{m}{p} \rfloor} \mu(d)F(dp)
\]

再把\(F(dp)\)换成最终式:

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

令\(T=dp\),则有:

\[\sum^{min(n,m)}_ {T=1} \sum_{t|T,t\in prime} \mu(\lfloor \frac{T}{t} \rfloor)\lfloor \frac{n}{T} \rfloor\lfloor \frac{m}{T} \rfloor
\]

\[\sum^{min(n,m)}_ {T=1} \lfloor \frac{n}{T} \rfloor\lfloor \frac{m}{T} \rfloor(\sum_{t|T} \mu(\lfloor \frac{T}{t} \rfloor))
\]

推到这里,我们就都可以做了

\(\mu(\space)\)可以线性筛,其他的可以整除分块

CODE

#include<bits/stdc++.h>
#define reg register
using namespace std;
namespace yspm{
inline int read()
{
int res=0,f=1; char k;
while(!isdigit(k=getchar())) if(k=='-') f=-1;
while(isdigit(k)) res=res*10+k-'0',k=getchar();
return res*f;
}
const int N=10000010;
bool vis[N]; int pri[N],mu[N],g[N],cnt;
#define ll long long
ll sum[N];
inline void prework()
{
mu[1]=1;
for(reg int i=2;i<N;++i)
{
if(!vis[i]){mu[i]=-1;pri[++cnt]=i;}
for(reg int j=1;j<=cnt&&pri[j]*i<N;++j)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
else mu[pri[j]*i]-=mu[i];
}
}
for(reg int j=1;j<=cnt;++j)
{
for(reg int i=1;i*pri[j]<N;++i) g[i*pri[j]]+=mu[i];
}
for(reg int i=1;i<N;++i) sum[i]=sum[i-1]+(ll)g[i];
return ;
}
inline void work()
{
int n=read(),m=read(); if(n>m) swap(n,m);
ll ans=0;
for(reg int l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=1ll*(n/l)*(m/l)*(sum[r]-sum[l-1]);
}printf("%lld\n",ans);
return ;
}
signed main()
{
prework(); int T=read(); while(T--) work();
return 0;
}
}
signed main(){return yspm::main();}

不禁感叹一句,能让 \(yspm\) 这种信奉 \(define \space int \space long \space long\) 的人都不全用 $ long \space long $ 的得是什么卡常\(sb\)题呀!!!

LGOJ2257 YY的GCD的更多相关文章

  1. BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discu ...

  2. [BZOJ2820]YY的GCD

    [BZOJ2820]YY的GCD 试题描述 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少 ...

  3. bzoj 2820 YY的GCD 莫比乌斯反演

    题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性 ...

  4. 【BZOJ】【2820】YY的GCD

    莫比乌斯反演 PoPoQQQ讲义第二题. 暴力枚举每个质数,然后去更新它的倍数即可,那个g[x]看不懂就算了…… 为什么去掉了一个memset就不T了→_→…… /****************** ...

  5. 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&&bzoj 2820 YY的GCD&&BZOJ 3529 数表)

    首先我们来看一道题  BZOJ 2301 Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd( ...

  6. 【BZOJ 2820】 YY的GCD (莫比乌斯+分块)

    YY的GCD   Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少 ...

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

    [BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{ ...

  8. YY的GCD

    YY的GCD 给出T个询问,询问\(\sum_{i=1}^N\sum_{j=1}^M(gcd(i,j)\in prime)\),T = 10000,N, M <= 10000000. 解 显然质 ...

  9. 洛谷【P2257】YY的GCD

    YY的GCD 原题链接 这应该是我做的第一道莫比乌斯反演的题目. 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x ...

随机推荐

  1. 使用Object类为实例定义方法和属性

    1.1 可以使用 Object 类直接定义个实例,并且为该对象赋属性和方法,例如: var person_1 = { nickName:"xiaowu", age:28, show ...

  2. 中后缀表达式/洛谷P1175 表达式的转换

    P1175 表达式的转换 思路:先用栈转成中缀表达式,再用栈进行计算.要输出过程,因此计算一次输出一次,但是栈没有迭代器,不好用,换成vector(可以pop_back).虽然表达式求值也可以这么做, ...

  3. 【JavaScript】回流(reflow)与重绘(repaint)

    重绘与回流 首先要了解页面是如何呈现的: HTML文档加载后生成DOM树(包括display:none;元素): 在DOM树的基础上配合css样式结构体生成render树(不包含display:non ...

  4. maven项目从本地向本地仓库导入jar包

    方法一(推荐): <dependency> <groupId>guagua-commons</groupId> <artifactId>guagua-c ...

  5. 吴裕雄--天生自然C++语言学习笔记:C++简介

    C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 年在贝尔实验室开始设计开发的.C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言.C++ 可运行于多种平台上,如 ...

  6. B - Given Length and Sum of Digits... CodeForces - 489C (贪心)

    You have a positive integer m and a non-negative integer s. Your task is to find the smallest and th ...

  7. 浅copy

    person=['aaa',['a',bbb'] p1=copy.copy(person) p2=person[:] p3=list(person) p4=person.copy() print(ty ...

  8. torch基础学习

    目录 Pytorch Leture 05: Linear Rregression in the Pytorch Way Logistic Regression 逻辑回归 - 二分类 Lecture07 ...

  9. Android :TextView使用SpannableString设置复合文本

    TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能: 1.Bac ...

  10. web项目servlet&jsp包失效问题

    今天偶然遇到这样的一个问题,故做个总结. javaee开发只用到serlet和jsp两个包.而sun提供的jdk只是javase部分的包,对于se部分只提供了规范,而包由容器给出. 由于自己在新建好一 ...