BZOJ 2301 Problem B(x属于[a,b],y属于[c,d]满足gcd(x,y)=k的(x,y)的有序对数)
2016-06-04 14:01
351 查看
题目链接:
BZOJ 2301 Problem B
题意:
区间x∈[a,b],y∈[c,d]满足gcd(x,y)=k的(x,y)的有序对数
分析:
莫比乌斯反演+优化。
BZOJ 2301 Problem B
题意:
区间x∈[a,b],y∈[c,d]满足gcd(x,y)=k的(x,y)的有序对数
分析:
莫比乌斯反演+优化。
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <climits> #include <bitset> using namespace std; const int MAX_N = 50010; typedef long long ll; bitset<MAX_N> bs; int prime_cnt, prime[MAX_N]; ll mu[MAX_N], sum[MAX_N]; void GetMu() { bs.set(); prime_cnt = 0; memset(mu, 0, sizeof(mu)); mu[1] = 1; for(int i = 2; i < MAX_N; ++i) { if(bs[i] == 1){ mu[i] = -1; prime[prime_cnt++] = i; } for(int j = 0; j < prime_cnt && i * prime[j] < MAX_N; ++j) { bs[i* prime[j]] = 0; if(i % prime[j]) { mu[i * prime[j]] = -mu[i]; }else { mu[i * prime[j]] = 0; break; } } } for(int i = 1; i < MAX_N; ++i) { sum[i] = sum[i - 1] + mu[i]; } } ll solve(int n, int m)//计算[1,n]和[1,m]区间有多少有序对(x, y)使得gcd(x,y) = 1 { ll ans = 0; int top = min(n, m), last; for(int i = 1; i <= top; ++i) { last = min(n / (n / i), m / (m / i)); ans += (ll) (n / i) * (m / i) * (sum[last] - sum[i - 1]); i = last; } return ans; } int main() { GetMu(); int T, a, b, c, d, k; scanf("%d", &T); while(T--) { scanf("%d%d%d%d%d", &a, &b, &c, &d, &k); if(k == 0){ printf("0\n"); continue; } ll ans = solve(b / k, d / k) + solve((a - 1) / k, (c - 1) / k) - solve((a - 1) / k, d / k) - solve((c - 1) / k, b / k); printf("%lld\n", ans); } return 0; }
相关文章推荐
- HDU 5341 Gcd and Lcm
- BZOJ 3529 [Sdoi2014]数表
- 【POI2007】【BZOJ1101】Zap
- 【SDOI2014】【BZOJ3529】数表
- hdu_4746_莫比乌斯反演
- hdu 5212(容斥原理)
- hdu 1695 GCD
- hdu 4746 Mophues
- 51nod 1192 Gcd表中的质数
- BZOJ 2440 完全平方数
- BZOJ 2820: YY的GCD
- 2301: [HAOI2011]Problem b|莫比乌斯反演
- 2820: YY的GCD|莫比乌斯反演
- BZOJ 4407: 于神之怒加强版|莫比乌斯反演
- BZOJ 1101: [POI2007]Zap|莫比乌斯反演
- BZOJ 3994: [SDOI2015]约数个数和|莫比乌斯反演
- 2693: jzptab|莫比乌斯反演
- BZOJ 2005 能量采集(莫比乌斯反演)
- SPOJ - VLATTICE Visible Lattice Points(gcd(x,y,z)=1的对数/莫比乌斯反演)
- Bzoj2301: [HAOI2011]Problem b:莫比乌斯反演