~~~题面~~~

题解:

$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. Redis系列二 Redis数据库介绍

    1.SELECT命令 通过查看配置文件可以知道Redis默认有17个库,从0-16. 默认是在0号库.选择库使用SELECT <dbid>命令.例如选择0号库  SELECT 0 2.DB ...

  2. letsencrypt证书-使用certbot申请wildcard证书

    目录 1. certbot安装 2. 认证方式 3. 运行命令 4. 更新 1:下载 2:配置 3:申请证书 4:续期证书 1. certbot安装 cd /usr/local/src wget ht ...

  3. 转:Docker创建centos的LNMP镜像

    转自:http://www.vckai.com/p/29  1. 安装docker 这个就不说了,不会的可以看下我之前的文章<Docker介绍及安装>. 1)启动docker # serv ...

  4. outer join test

    create table t1_outerjoin(a int, b int , c int); create table t2_outerjoin(a int); create table t3_o ...

  5. Appium1.8及以上命令行启动

    安装命令行启动版本的Appium,appium-doctor需要独立下载了,用 npm的话需要FQ才好使,所有安装了cnpm代替npm, cnpm是从淘宝的国内镜像下载 npm config rm p ...

  6. Uncaught Error: code length overflow. (1604>1056)

    解决方法来源~~~https://blog.csdn.net/arrowzz/article/details/80656510 二维码生成时,如果长度太长会有异常: Uncaught Error: c ...

  7. 初涉 JavaScript

    网页是什么 网页 = Html+CSS+JavaScriptHtml:网页元素内容CSS:控制网页样式JavaScript:操作网页内容,实现功能或者效果 JavaScirpt 发展历史 参考 使用 ...

  8. Python中的namespace package

    在Python 3.3之前,一个目录想被当成package被导入,必须包含__init__.py文件:而在Python 3.3及以后的版本中,__init__.py文件可以不需要,直接使用import ...

  9. 初学c#(又要打代码了好难)

    因为我原来从没有学过C#,所以要重新看一个语言的基本语法,仔细阅读了老师的作业要求,发现第一个10分的作业如果要用c语言写我是可以完成的,于是定个小目标就是在周日前完成作业的第一步.今天我在菜鸟教程的 ...

  10. c#积累之测试

    初来上班,免不了看别人代码.快速搞懂别人代码是我现在受到的一大挑战.寻摸着规律,发现一边进行调试,一边进行行行注释的逻辑判断不失为一种妙招. c#调试用的是vs2012.f11键和f10和f5键的应用 ...