bzoj 2820 YY的GCD 莫比乌斯反演

题目大意:

给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对

这里就抄一下别人的推断过程了

后面这个g(x) 算的方法就是在线性筛的时候只考虑当前的数最小因子,如果进来的最小因子不存在,相当于在之前那个数的基础上的每个mu值都多加了一个质数,那么

这些mu值就要取反,如果已经包含了这个最小因子,我这里另外进行了跟之前类似的讨论方法,在代码中写着

因为这题目数据比较大,这里求解的时候不应该线性求,因为总是有一段区间的n/i*(m/i)值相同,将g[]数组求一个前缀和,记录一段区间得到的值,可以缩小到

sqrt(n)的复杂度

 1 /*bzoj2820 YY的GCD*/
 2 #include <bits/stdc++.h>
 3
 4 using namespace std;
 5 #define ll long long
 6 #define N 10000000
 7 int mu[N+5] , prime[N+5] , tot , f[N+5] , sum[N+5];
 8 bool check[N+5];
 9
10 void get_mu()
11 {
12     mu[1] = 1;
13     for(int i=2 ; i<=N ; i++){
14         if(!check[i]){
15             prime[tot++] = i;
16             mu[i] = -1;
17             f[i] = 1;
18         }
19         for(int j=0 ; j<tot ; j++){
20             if((ll)prime[j]*i>N) break;
21             check[prime[j]*i] = true;
22             if(i%prime[j]){
23                 mu[i*prime[j]] = -mu[i];
24                 f[i*prime[j]] = -f[i]+mu[i];
25             }else{
26                 /*
27                 本身i中已经含有素数prime[j]
28                 在if中表示含有至少3个因子prime[j],那么最后不管怎么样,当前数值除以一个因子都至少
29                 含有两个prime[j],那么必然为0
30                 else 只有2个prime[j]的情况,那么就是除了除以prime[j]其他情况得到的都是至少有两个因子
31                 的,那么mu[]必然为0,而因为从当前增加了一个因子,那么就是讲那个取到的取反就可以了
32                 */
33                 if((i/prime[j])%prime[j]==0) f[i*prime[j]] = mu[i];
34                 else f[i*prime[j]] = -mu[i/prime[j]];
35                 break;
36             }
37         }
38     }
39     for(int i=1 ; i<=N ; i++) sum[i] = sum[i-1]+f[i];
40 }
41 int n , m;
42
43 ll solve()
44 {
45     int mn = min(n , m) , last ;
46     ll ret=0;
47     for(int i=1 ; i<=mn ; i=last+1){
48         last = min(n/(n/i) , m/(m/i));
49         ret += (ll)(sum[last]-sum[i-1])*(n/i)*(m/i);
50     }
51     return ret;
52 }
53
54 int main()
55 {
56     freopen("in.txt" , "r" , stdin);
57     get_mu();
58     int T;
59     scanf("%d" , &T);
60     while(T--){
61         scanf("%d%d" , &n , &m);
62         printf("%lld\n" , solve());
63     }
64     return 0;
65 }
时间: 2024-10-11 21:55:50

bzoj 2820 YY的GCD 莫比乌斯反演的相关文章

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

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discuss] Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必然不会了,于是向你来请教……多组输入 Input 第一行一个整数T 表述数据组数接下来T行,每行两个正

BZOJ 2820 YY的GCD ——莫比乌斯反演

我们可以枚举每一个质数,那么答案就是 $\sum_{p}\sum_{d<=n}\mu(d)*\lfloor n / pd \rfloor *\lfloor m / pd \rfloor$ 直接做?TLE 考虑优化,由于看到了pd是成对出现的,令T=pd $ans=\sum_{T<=min(n,m)}\lfloor n / T \rfloor *\lfloor m / T \rfloor \sum_{p \mid T}\mu(T/p)$ 或者 $ans=\sum_{T<=min(n,m)}

【刷题】BZOJ 2820 YY的GCD

Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必然不会了,于是向你来请教……多组输入 Input 第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M Output T行,每行一个整数表示第i组数据的结果 Sample Input 2 10 10 100 100 Sample Output 30 2791 HINT T = 10000 N

bzoj 2820: YY的GCD

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必然不会了,于是向你来请教……多组输入 Input 第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M Output T行,每行一个整数表示第i组数据的结果 Sample Input

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}次询问 莫比乌斯反演入门题 为方便表述,由于n和m等价,以下内容均默认n<=m 题目让我们求:$\sum_{k=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k]$ 容易变形为:$\sum_{k=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{k} \righ

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

YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对k. Input 第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M. Output T行,每行一个整数表示第 i 组数据的结果 Sample Input 2 10 10 100 100 Sample Output

BZOJ2820 YY的GCD 莫比乌斯反演

题意:求x∈[1,N],y∈[1,M]中gcd(x,y)为质数的数对的数量. 题解: 这个题把BZOJ2301中的k改成枚举素数就能过啦……才怪,不过和那个题的思路类似,但我们不枚举每一个质数,而是直接枚举质数p的倍数T,得到\[{f_{A,B,p}} = \sum\limits_{p|T} {[{F_{A,B,T}}\sum\limits_{p|T} {\mu (\frac{T}{p})} ]} \]其中F,f的定义与2301中的相同,而分块的时候求和需要预处理出来后面那个和式,稍微修改一下线

P2257 YY的GCD (莫比乌斯反演)

题意:求\[\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = prim]\] 题解:那就开始化式子吧!! \[f(d) = \sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j) = d]\] \[F(x) = \sum_{d|x} f(d) = \left \lfloor \frac{n}{x} \right \rfloor \left \lfloor \frac{m}{x} \right \rfloor\] \[f(d) = \sum_{d|

BZOJ 2820: YY的GCD | 数论

题目: 题解: #include<cstdio> #include<algorithm> #define N 10000005 typedef long long ll; using namespace std; int T,n,m,cnt; bool mark[N]; int pri[N],mu[N]; ll f[N]; void getphi() { mu[1]=1; for (int i=2;i<N;i++) { if (!mark[i]) pri[++cnt]=i,m