HDU 1695 GCD (容斥 + 莫比烏斯反演)
GCD
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7450 Accepted Submission(s): 2731
Problem Description
Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're
only required to output the total number of different number pairs.
Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.
Yoiu can assume that a = c = 1 in all test cases.
Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.
Yoiu can assume that a = c = 1 in all test cases.
The input consists of several test cases. The first line of the input is the number of the cases. There are no more than 3,000 cases.
Each case contains five integers: a, b, c, d, k, 0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000, as described above.
Each case contains five integers: a, b, c, d, k, 0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000, as described above.
For each test case, print the number of choices. Use the format in the example.
2
1 3 1 5 1
1 11014 1 14409 9
Case 1: 9
Case 2: 736427
Hint
For the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).2008 “Sunline Cup” National
Invitational Contest
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1695
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1695
題目分析:HDU的資料太水了,這題用分塊求和優化和不做優化跑出來都是15ms,類似BZOJ 2301,比那個簡單,不過比那個坑多了,不懂這個k為什麼要從0開始。。。特判答案為0兩種情況,一個是k=0,另一個是max(b, d) < k,把區間化成(1, b/k),(1, d/k),就是求兩個區間各取出一個數使它們gcd為1的個數,剩下來的用莫比烏斯反演求就行了,然後就是這題的(a,b)和(b,a)算一種,因此要去重,方法很簡單,比如第一個樣例,區間1 5包含了1 3,因此要減去重複的部分,重複的部分就是cal(3, 3) / 2了,最後要用long long,算了下,極限資料答案是3e9左右,就超這麼一點點,還真看不出來。。。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
int const MAX = 1e5 + 5;
int mob[MAX], p[MAX], sum[MAX];
bool prime[MAX];
void Mobius()
{
int pnum = 0;
memset(sum, 0, sizeof(sum));
memset(prime, true, sizeof(prime));
mob[1] = 1;
sum[1] = 1;
for(int i = 2; i < MAX; i++)
{
if(prime[i])
{
p[pnum ++] = i;
mob[i] = -1;
}
for(int j = 0; j < pnum && i * p[j] < MAX; j++)
{
prime[i * p[j]] = false;
if(i % p[j] == 0)
{
mob[i * p[j]] = 0;
break;
}
mob[i * p[j]] = -mob[i];
}
sum[i] = sum[i - 1] + mob[i];
}
}
ll cal(int l, int r)
{
if(l > r)
swap(l, r);
ll ans = 0;
for(int i = 1, last = 0; i <= l; i = last + 1)
{
last = min(l / (l / i), r / (r / i));
ans += (ll) (l / i) * (r / i) * (sum[last] - sum[i - 1]);
}
return ans;
}
int main()
{
Mobius();
int T;
scanf("%d", &T);
for(int ca = 1; ca <= T; ca++)
{
int a, b, c, d, k;
scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);
if(k == 0 || max(b, d) < k)
{
printf("Case %d: 0\n", ca);
continue;
}
int mi = min(b / k, d / k);
printf("Case %d: %I64d\n", ca, cal(b / k, d / k) - cal(mi, mi) / 2);
}
}
相關文章
- Hackerrank GCD Product(莫比烏斯反演)GC
- cf900D. Unusual Sequences(容斥 莫比烏斯反演)
- 莫比烏斯反演
- 洛谷 P2257 YY的GCD(莫比烏斯反演)GC
- 比較典的莫比烏斯反演
- 莫比烏斯反演學習筆記筆記
- Problem H. Curious (莫比烏斯反演)
- 狄利克雷卷積 & 莫比烏斯反演卷積
- 狄利克雷卷積與莫比烏斯反演卷積
- 莫比烏斯
- 演算法隨筆——數論之莫比烏斯反演演算法
- SDOI2018 反迴文串(莫比烏斯反演+Pollard-Rho)
- 莫比烏斯函式函式
- SDOI2018 舊試題(莫比烏斯反演+三元環計數)
- lg容斥與反演
- 莫比烏斯函式 - 學習筆記函式筆記
- HDU 4135 Co-prime(容斥原理+分解質因數)
- 容斥
- HDU 4135——Co-prime(容斥原理&&二進位制列舉)
- 反射容斥反射
- 容斥原理
- 【模板】容斥原理
- Min-Max 容斥
- 容斥原理學習筆記筆記
- 容斥定理 AtCoder——FizzBuzz Sum Hard
- 容斥原理——數學知識
- P4178 Tree——點分治 容斥
- P1447 [NOI2010] 容斥原理
- Min-Max 容斥學習筆記筆記
- CodeForces571A. Lengthening Sticks(組合數學-容斥)
- 2018世界盃烏拉圭vs俄羅斯誰會贏 烏拉圭vs俄羅斯比分預測
- GCD Inside: GCD 宏GCIDE
- HDU - 6291 對稱數 (樹上莫隊+分塊) (2018CCPC女生賽)
- 薩繆爾·莫爾斯:電報之父的傳奇人生
- cf449D. Jzzhu and Numbers(容斥原理 高維字首和)
- 機率期望進階 + Min-Max容斥 練習題
- 「數學」助力每一個不知死活的容斥夢
- 《漫威蜘蛛俠:邁爾斯·莫拉萊斯》IGN評測:擺盪到新高度
- Ignatius and the Princess IV——伊格納提烏斯和四公主