~~~题面~~~

题解:

$ans = \sum_{x = 1}^{n}\sum_{y = 1}^{m}\sum_{i = 1}^{k}[gcd(x, y) == p_{i}]$其中k为质数个数
    $$ans = \sum_{i = 1}^{k}\sum_{x = 1}^{n}\sum_{y = 1}^{m}[gcd(x, y) == p_{i}]$$
    设$f(d)$表示$x$从$1$到$n$,$y$从$1$到$m$,$gcd == d$的个数,$g(d)$表示相同条件下$d | gcd$(即$gcd$为$d$的倍数)的个数
    那么$$f(d) = \sum_{x = 1}^{n}\sum_{y = 1}^{m}[gcd(x, y) == d]$$,$$g(d) = \lfloor{\frac{n}{d}}\rfloor\lfloor{\frac{m}{d}}\rfloor$$
    因为$$g(x) = \sum_{x|d}^{min(n, m)}f(d)$$
    所以反演一下。
    $$f(x) = \sum_{x | d}^{min(n, m)}\mu(\frac{d}{x})g(d)$$
    那么$ans = \sum_{i = 1}^{k}f(p_{i})$
    $$= \sum_{i = 1}^{k}\sum_{x | d}^{min(n, m)}\mu(\frac{d}{x})g(d)$$
    改成直接枚举系数
    $$= \sum_{i = 1}^{k}\sum_{d = 1}^{\lfloor{\frac{min(n, m)}{p_{i}}}\rfloor}\mu(d)g(dp_{i})$$
    $$= \sum_{i = 1}^{k}\sum_{d = 1}^{\lfloor{\frac{min(n, m)}{p_{i}}}\rfloor}\mu(d)\lfloor{\frac{n}{dp_{i}}\rfloor \lfloor{\frac{m}{dp_{i}}\rfloor}}$$<---枚举每个$\mu(d)分别被每个质数统计了几次$
    $$= \sum_{T = 1}^{min(n, m)} \lfloor{\frac{n}{T}}\rfloor \lfloor{\frac{m}{T}}\rfloor\sum_{k|T}{\mu(\frac{T}{k})}$$<---枚举每个$\lfloor{\frac{n}{T}}\rfloor \lfloor{\frac{m}{T}}\rfloor$会给哪些$\mu$做贡献(哪些$\mu$会在某次被统计$\lfloor{\frac{n}{T}}\rfloor \lfloor{\frac{m}{T}}\rfloor$次)
    然后暴力枚举质数和系数,给对应的$\mu$做贡献(质数$p_{i}$给它的倍数做贡献),统计前缀和,对前面的$\lfloor{\frac{n}{T}}\rfloor \lfloor{\frac{m}{T}}\rfloor$进行整数分块处理

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 10000100
#define LL long long
int n, m, tot, t;
int prime[AC], mu[AC];
LL s[AC], ans;
bool z[AC]; inline int read()
{
int x = ;char c = getchar();
while(c > '' || c < '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} void pre()
{
int now;
mu[] = ;
for(R i = ; i <= ; i++)
{
if(!z[i]) prime[++tot] = i, mu[i] = -;
for(R j = ; j <= tot; j++)
{
now = prime[j];
if(i * now > ) break;
z[i * now] = true;
if(!(i % now)) break;
mu[now * i] = -mu[i];
}
}
int p;
for(R i = ; i <= tot; i++)//枚举质数
{
p = prime[i];//卡常
for(R j = p; j <= ; j += p) //枚举倍数
s[j] += mu[j / p];//or j = 系数, s[j * prime[i]] += mu[j];
}
for(R i = ; i <= ; i++) s[i] += s[i - ];
} void work()
{
t = read();
while(t--)
{
int pos = ;
ans = ;
n = read(), m = read();
int b = min(n, m);//这里要取min!!!
for(R i = ; i <= b; i = pos + )
{
pos = min(n / (n / i), m / (m / i));
ans += (LL) (n / i) * (LL) (m / i) * (LL) (s[pos] - s[i - ]);//error 只有ans是LL是不够的
}
printf("%lld\n", ans);
}
} int main()
{
// freopen("in.in", "r", stdin);
//freopen("YYnoGCD.in", "r", stdin);
//freopen("YYnoGCD.out", "w", stdout);
pre();
work();
//fclose(stdin);
//fclose(stdout);
return ;
}

YY的GCD 莫比乌斯反演的更多相关文章

  1. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)

    [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...

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

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

  3. 洛谷P2257 YY的GCD 莫比乌斯反演

    原题链接 差不多算自己推出来的第一道题QwQ 题目大意 \(T\)组询问,每次问你\(1\leqslant x\leqslant N\),\(1\leqslant y\leqslant M\)中有多少 ...

  4. Luogu P2257 YY的GCD 莫比乌斯反演

    第一道莫比乌斯反演...$qwq$ 设$f(d)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]$ $F(n)=\sum_{n|d}f(d)=\lfloor \frac{N ...

  5. 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}次询问 莫比乌斯反演入门题 为方便 ...

  6. Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)

    2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...

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

    题目链接 大意 给定多组\(N\),\(M\),求\(1\le x\le N,1\le y\le M\)并且\(Gcd(x, y)\)为质数的\((x, y)\)有多少对. 思路 我们设\(f(i)\ ...

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

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

  9. 【BZOJ2820】YY的GCD [莫比乌斯反演]

    YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 求1<=x<=N, ...

  10. bzoj 2820 YY的GCD - 莫比乌斯反演 - 线性筛

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

随机推荐

  1. PHP程序员如何理解依赖注入容器(dependency injection container)

    背景知识 传统的思路是应用程序用到一个Foo类,就会创建Foo类并调用Foo类的方法,假如这个方法内需要一个Bar类,就会创建Bar类并调用Bar类的方法,而这个方法内需要一个Bim类,就会创建Bim ...

  2. Windows系统常用修复命令 无须重装系统

    1.0 netsh int ipv4 reset 2.0 netsh winsock reset winsock是Windows网络编程接口,winsock工作在应用层,它提供与底层传输协议无关的高层 ...

  3. git的一些操作指令

    1. mkdir learn 创建learn文件夹(也可不用命令创建,直接右击新建即可)   cd learn进入learn文件夹   git init  把learn文件夹 变成 可以用git管理的 ...

  4. XSS--编码绕过,qcms,鲶鱼cms

    一.编码绕过 1)HTML进制编码 标签中的某些属性值可以使用html十进制.十六进制表示 2)JavaScript编码 JavaScript支持unicode.八进制.十六进制.十进制等 3)URL ...

  5. TPO-12 C1 Revise a Hemingway paper

    TPO-12 C1 Revise a Hemingway paper 第 1 段 1.Listen to a conversation between a student and a professo ...

  6. Laxcus大数据管理系统2.0(12)- 第十章 运行

    第十章 运行 本章将介绍一些Laxcus集群基本运行.使用情况,结合图片和表格表示.地点是我们的大数据实验室,使用我们的实验集群.数据来自于我们的合作伙伴,软件平台混合了Windows和Fedora  ...

  7. python常用命令—查看模块所在位置

    环境:ipython3 交互式解释器 语法: import 模块名 模块名.__file__ 功能: 查看模块的所在位置 例:

  8. Python3获取新浪微博内容乱码问题

    用python获取新浪微博最近发布内容的时候调用 public_timeline()函数的返回值是个jsonDict对象,首先需要将该对象通过json.dumps函数转换成字符串,然后对该字符串用GB ...

  9. SGU 520 Fire in the Country(博弈+搜索)

    Description This summer's heat wave and drought unleashed devastating wildfires all across the Earth ...

  10. NSValue的valueWithBytes:objCType:方法

    + (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; NSValue的valueWithBytes: ...