洛谷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 }