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

Description

  求有多少对(x,y)的gcd为素数,x<=n,y<=m。n,m<=1e7,T<=1e4。

Solution

  因为题目要求gcd为素数的,那么我们就只考虑素数mu的贡献就行了

  对于p,对于k*p的贡献是mu[k]

  然后加上整除分块优化就行了

  p可以筛完素数处理,处理复杂度为O(n/log*log)正好为O(n)

Code

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define ll long long
 5 using namespace std;
 6
 7 const int maxn=1e7+5;
 8
 9 int flag[maxn],prime[maxn],mu[maxn],cnt;
10 ll sum[maxn];
11 int n,m;
12
13 void getmu(){
14     mu[1]=1;
15     for(int i=2;i<=1e7;i++){
16         if(!flag[i]){
17             prime[++cnt]=i;
18             mu[i]=-1;
19         }
20         for(int j=1;i*prime[j]<=1e7&&j<=cnt;j++){
21             flag[i*prime[j]]=1;
22             if(i%prime[j]==0){
23                 mu[i*prime[j]]=0;
24                 break;
25             }
26             mu[i*prime[j]]=-mu[i];
27         }
28     }
29     for(int i=1;i<=cnt;i++)
30         for(int j=prime[i];j<=1e7;j+=prime[i])
31             sum[j]+=mu[j/prime[i]];
32     for(int i=1;i<=1e7;i++)
33         sum[i]+=sum[i-1];
34 }
35
36 int main(){
37     getmu();
38     int T;
39     scanf("%d",&T);
40     while(T--){
41         scanf("%d%d",&n,&m);
42         if(n>m) swap(n,m);
43         ll ans=0;
44         for(int i=1,pos=1;i<=n;i=pos+1){
45             pos=min(n/(n/i),m/(m/i));
46             ans+=(sum[pos]-sum[i-1])*(n/i)*(m/i);
47         }
48         printf("%lld\n",ans);
49     }
50     return 0;
51 }
时间: 2024-10-19 07:07:18

【莫比乌斯反演】BZOJ2820 YY的GCD的相关文章

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中的相同,而分块的时候求和需要预处理出来后面那个和式,稍微修改一下线

[BZOJ2820]YY的GCD

试题描述 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种傻×必然不会了,于是向你来请教--多组输入 输入 第一行一个整数T 表述数据组数接下来T行,每行两个正整数,表示N, M 输出 T行,每行一个整数表示第i组数据的结果 输入示例 2 10 10 100 100 输出示例 30 2791 数据规模及约定 T = 10000N, M <= 10000000 题解 枚举公约素数 p

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)值

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

[BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{d=1}^n[d\_is\_prime]\sum_{i=1}^{n/d}[\frac{n}{id}][\frac{m}{id}]\] 老套路了 令\(T=id\) \[ans=\sum_{T=1}^{n}[\frac{n}{T}][\frac{m}{T}]\sum_{d|T}[d\_is\_prim

【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

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行,每行两个正

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

P2257 YY的GCD luogu题解第一篇非常棒,当然你也可以point here(转) 正题因为题解写的太优秀所以没得补充 这里用了一个卡常技巧:循环展开 就是以代码长度为代价减少循环次数 实测快了15ms(一个点1.5ms....) (用了快读更慢???(大雾)但是register真有用) #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #define re

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

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

[题目链接] https://www.luogu.org/problemnew/show/P2257 // luogu-judger-enable-o2 /* ----------------------- [题解] https://www.luogu.org/blog/peng-ym/solution-p2257 [莫比乌斯反演] http://www.cnblogs.com/peng-ym/p/8647856.html [整除分块] http://www.cnblogs.com/peng-y