这题美好体验就是卡常

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. 杂点-shell

    使用while循环读取文件 cat file.txt |while read line do echo $line done 或者: while read line do echo $line don ...

  2. Python自学之路---Day01

    目录 Python自学之路---Day01 注释 单行注释 多行注释 print()函数 语法 参数 实例 input()函数 语法 参数 实例 查看Python的关键字 代码 变量与常量 变量 如何 ...

  3. composer命令卡慢,使用国内源

    执行composer install.update 和require的时候,遇到卡住不动的情况,可以切换到国内阿里云的源 composer config -g repo.packagist compo ...

  4. c语言中%s和%d的区别

    /************************************************************************* > File Name: ptr_both. ...

  5. MySQL--基础SQL--DCL

    DCL语句主要是DBA用来管理系统中的对象权限时使用,一般的开发人员很少使用. 1.创建一个数据库用户在z1,具有对sakila数据库中所有表的SELECT/INSERT权限: GRANT SELEC ...

  6. [Java-基础] 什么是ORM

    ORM简介 ORM:对象关系映射:Object Relational Mapping 用于实现面向对象编程语言里不同类型系统的数据之间的转换 ​ 一般的,数据库绝大部分是面向关系的数据库,但是写代码的 ...

  7. mysql my.cnf常用的配置

    [mysqld]basedir = /usr/local/mysql/datadir = /usr/local/mysql/dataport = 3306pid-file = /usr/local/m ...

  8. html_js_jq_css

    // ----- JQ $(function(){$(div').bind('mouseout mouseover', function () {// 移入和移出分别执行一次alert('bind 可 ...

  9. JavaScript数组去重(5种方法)

    // 数组去重 let arr = ['a', 'b', 'b', 1, 1, 'true', true, true, NaN, NaN, 'NaN', undefined, undefined, n ...

  10. PHP使用redis防止大并发下二次写入

    php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写. $lock_k ...