P2257 YY的GCD

P2257 YY的GCD

题目描述

神犇YY虐完数论后给傻×kAc出了一题

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

kAc这种傻×必然不会了,于是向你来请教……

多组输入

输入输出格式

输入格式:

第一行一个整数T 表述数据组数

接下来T行,每行两个正整数,表示N, M

输出格式:

T行,每行一个整数表示第i组数据的结果

输入输出样例

输入样例#1: 复制

2
10 10
100 100

输出样例#1: 复制

30
2791

说明

T = 10000

N, M <= 10000000

思路:倍数莫比乌斯反演。

(太长时间没写字了。。

代码:

 1 #include<bits/stdc++.h>
 2 #define  ll long long
 3 using namespace std;
 4 const int N = 1e7 + 5;
 5 int t;
 6 //线性筛法求莫比乌斯函数
 7 bool vis[N + 10];
 8 int pri[N + 10];
 9 int mu[N + 10];
10 ll sum[N];
11 int f[N];
12 void mus() {
13     memset(vis, 0, sizeof(vis));
14     memset(f,0, sizeof(f));//f[n]=sum(mu[n/p])
15     mu[1] = 1;
16     int tot = 0;
17     for (int i = 2; i < N; i++) {
18         if (!vis[i]) {
19             pri[tot++] = i;
20             mu[i] = -1;
21         }
22         for (int j = 0; j < tot && i * pri[j] < N; j++) {
23             vis[i * pri[j]] = 1;
24             if (i % pri[j] == 0) {
25                 mu[i * pri[j]] = 0;
26                 break;
27             }
28             else  mu[i * pri[j]] = -mu[i];
29         }
30     }
31     for(int i=1;i<N;i++)
32         for(int j=0;j<tot&&pri[j]*i<N;j++) f[i*pri[j]]+=mu[i];//需要重复更新,不能放在线性筛内部
33     sum[1]=0;
34     for(int i=2;i<N;i++) sum[i]=sum[i-1]+f[i];
35 }
36 int n,m,k;
37 ll cal(int x,int y){
38     int ma=min(x,y);
39     ll res=0;
40     for(int i=1,j;i<=ma;i=j+1){
41         j=min(x/(x/i),y/(y/i));
42         if(j>=ma) j=ma;
43         res+=1ll*(sum[j]-sum[i-1])*(x/i)*(y/i);
44     }
45     return res;
46 }
47
48 int main() {
49     mus();
50     scanf("%d",&t);
51     for(int i=1;i<=t;i++){
52         scanf("%d%d",&n,&m);
53         ll ans;
54         ans=cal(n,m);
55         printf("%lld\n",ans);
56     }
57     return 0;
58 }

原文地址:https://www.cnblogs.com/mj-liylho/p/9574463.html

时间: 2024-08-30 12:16:40

P2257 YY的GCD的相关文章

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

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

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

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|

[题解]luogu P2257 YY的GCD

袁野的gcd 首先可以肯定的是这是一道数论题 所以题目就是: \(\sum_{i=1}^N \sum_{j=1}^M [gcd(i,j)\in prime]\) 接下来就可以愉快的推式子了~ 首先可以按套路枚举 prime 和 gcd \(\sum_{p \in prime}\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)=p]\) 所以我们显然可以将\(i\)和\(j\) 同时除以 \(p\),得到 \(\sum_{p\in prime}\sum_{i=1}^{N}\sum_

luogu P2257 YY的GCD

嘟嘟嘟 感觉这几道数论题都差不多,但这到明显是前几道的升级版. 推了一大顿只能得60分,不得不看题解. 各位看这老哥的题解吧 我就是推到他用\(T\)换掉\(kd\)之前,然后枚举\(T\)的.这个转换确实想不出来啊. 还有最后一句,最终的式子 \[\sum_{T = 1} ^ {n} \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor * \sum_{k | T} \mu(\frac{T}{k}) (k \in prime)\] 他把

洛谷【P2257】YY的GCD

YY的GCD 原题链接 这应该是我做的第一道莫比乌斯反演的题目. 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于是向你来请教-- 多组输入 输入输出格式 输入格式: 第一行一个整数T 表述数据组数 接下来T行,每行两个正整数,表示N, M 输出格式: T行,每行一个整数表示第i组数据的结果 说明 T=10000,N, M <= 10000000 解

【BZOJ 2820】 YY的GCD

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

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 YY的GCD 莫比乌斯反演

题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性筛的时候只考虑当前的数最小因子,如果进来的最小因子不存在,相当于在之前那个数的基础上的每个mu值都多加了一个质数,那么 这些mu值就要取反,如果已经包含了这个最小因子,我这里另外进行了跟之前类似的讨论方法,在代码中写着 因为这题目数据比较大,这里求解的时候不应该线性求,因为总是有一段区间的n/i*(m/i)值