【BZOJ2820】ygy的gcd

不知道为什么不想写总结,只是(因为是用别人的权限号交的所以)屯一个代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 #define ll long long
 8 const ll inf=(ll)2e9;
 9 ll rd(){ll z=0,mk=1;  char ch=getchar();
10     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)mk=-1;  ch=getchar();}
11     while(ch>=‘0‘&&ch<=‘9‘){z=(z<<3)+(z<<1)+ch-‘0‘;  ch=getchar();}
12     return z*mk;
13 }
14 void wt(ll x){if(x<0)  putchar(‘-‘),x=-x;
15     int wtp=0;  char wtc[52];
16     while(x)  wtc[++wtp]=(x%10)+‘0‘,x/=10;
17     while(wtp)  putchar(wtc[wtp--]);
18 }
19 int n,m;
20 int miu[11000000],prm[11000000],prp=0;  bool prg[11000000];
21 ll f[11000000],s[11000000];
22 void gtmiu(){
23     memset(prg,0,sizeof(prg));
24     miu[1]=1;
25     for(int i=2;i<=10000000;++i){
26         if(!prg[i])  prm[++prp]=i,miu[i]=-1;
27         for(int j=1;j<=prp && prm[j]*i<=10000000;++j){
28             prg[i*prm[j]]=true;
29             if(!(i%prm[j])){  miu[i*prm[j]]=0;  break;}
30             miu[i*prm[j]]=-miu[i];
31         }
32     }
33     for(int i=1;i<=prp;++i)for(int j=1;j*prm[i]<=10000000;++j)
34         f[j*prm[i]]+=miu[j];
35     for(int i=1;i<=10000000;++i)  s[i]=s[i-1]+f[i];
36 }
37 int main(){
38     //freopen("ddd.in","r",stdin);
39     gtmiu();
40 int T;  cin>>T;  while(T--){
41     n=rd(),m=rd();
42     ll ans=0;
43     if(n>m)  swap(n,m);
44     for(int i=1,j;i<=n;i=j+1){
45         j=min(n/(n/i),m/(m/i));
46         ans+=(s[j]-s[i-1])*(n/i)*(m/i);
47     }
48     wt(ans),putchar(‘\n‘);
49     continue;
50 }
51     return 0;
52 }

时间: 2024-10-16 11:25:09

【BZOJ2820】ygy的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

【莫比乌斯反演】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<cst

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

(转载)关于gcd的8题

发现其实有关gcd的题目还是挺多的,这里根据做题顺序写出8题. [bzoj2818: Gcd] gcd(x,y)=质数, 1<=x,y<=n的对数 做这题的时候,懂得了一个非常重要的转化:求(x, y) = k, 1 <= x, y <= n的对数等于求(x, y) = 1, 1 <= x, y <= n/k的对数!所以,枚举每个质数p(线性筛素数的方法见:线性时间内筛素数和欧拉函数),然后求(x, y) = 1, 1 <= x, y <= n/p的个数.

Holiday 7

不知不觉假期已经过去三分之一了.明天就是大年初一了,希望所有人在新的一年里都能比之前的自己有所突破. 今天上午主要看了看概率,DP本来就是我的一大弱点,更别说概率DP,期望DP了.数学和数据结构过完后马上开始搞DP和图论.然后和爷爷一起贴春联,才贴了两幅我爸妈就回来了,然后就带着我去了婆婆家,吃过饭去外面洗了个澡就回爷爷家了.值得一提的是,澡堂前台的那个女孩好漂亮啊,看着跟我一般的年纪,我进那第一眼就看到她咯.下午回来后算是把数据结构抛之脑后了,开了莫反的专题. BZOJ2818 GCD (ht

【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 (莫比乌斯+分块)

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 210 10100 100 Sample Output 302791 Hint T =