洛谷P2257 YY的GCD

今日份是数论

大概是。。从小学奥数到渐渐毒瘤

那就简单列一下目录【大雾

同余 质数密度 唯一分解定理 互质

完全剩余系 简化剩余系 欧拉函数 逆元 斐蜀定理

阶(及其性质) 欧拉定理 费马小定理 原根 调和级数 

欧拉函数推广到积性函数 完全积性函数 

莫比乌斯函数 莫比乌斯反演 

狄利克雷卷积 杜教筛 Lucas定理

 

回到这道题

题意:

给出n, m ∈ [1, 1e7] ,求有多少对(x, y)

满足x ∈ [1, n], y ∈ [1, m] 且 gcd(x, y) 为质数

 

字丑【痛心

 

附上代码

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 const int N = 1e7 + 5;
 5 
 6 int prm[N], mu[N], ps;
 7 bool ism[N];
 8 long long res[N], g[N];
 9 
10 inline void calc(int n){
11     mu[1] = 1;
12     for(int i = 2; i <= n; i++){
13         if(!ism[i]) {prm[++ps] = i; mu[i] = -1;}
14         for(int j = 1; j <= ps && prm[j] * i <= n; j++){
15             ism[prm[j] * i] = 1;
16             if(!(i % prm[j])) break;
17             mu[prm[j] * i] = -mu[i];
18         }
19     }
20     for(int i = 1; i <= ps; i++)
21         for(int j = 1; j * prm[i] <= n; j++)
22             g[j * prm[i]] += mu[j];
23     for(int i = 1; i <= n; i++)
24         res[i] = res[i - 1] + (long long) g[i];
25 }
26 
27 int main(){
28     int T; scanf("%d", &T);
29     long long ans;
30     int n, m;
31     calc(1e7);
32     while(T--){
33         scanf("%d%d", &n, &m);
34         if(n > m) swap(n, m);
35         ans = 0;
36         int i = 1, j;
37         while(i <= n){
38             j = min(n / (n / i), m / (m / i));
39             ans += (long long)(n / i) * (m / i) * (res[j] - res[i - 1]);
40             i = j + 1;
41         }
42         printf("%lld\n", ans);
43     }
44     return 0;    
45 }
View Code

 

posted @ 2018-08-01 17:32  hjmmm  阅读(148)  评论(0编辑  收藏  举报