BZOJ2301 [HAOI2011]Problem b

什么东西。。。

搞了半天Mobius反演到底是什么还是没搞定。。。(至少会求了嘛。。。好不好)

但是程序写出来了^_^,可惜意义不明T T

 1 /**************************************************************
 2     Problem: 2301
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:10604 ms
 7     Memory:1244 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <cmath>
12 #include <algorithm>
13
14 using namespace std;
15 typedef long long ll;
16 const int N = 50005;
17 int T;
18 int u[N], p[N], tot;
19 bool v[N];
20
21 inline int read(){
22     int x = 0;
23     char ch = getchar();
24     while (ch < ‘0‘ || ch > ‘9‘)
25         ch = getchar();
26
27     while (ch >= ‘0‘ && ch <= ‘9‘){
28         x = x * 10 + ch - ‘0‘;
29         ch = getchar();
30     }
31     return x;
32 }
33
34 void pre_work(){
35     u[1] = 1;
36     int i, j, K;
37     for (i = 2; i < N; ++i){
38         if (!v[i])
39             p[++tot] = i, u[i] = -1;
40         for (j = 1; i * p[j] < N && j <= tot; ++j){
41             v[K = i * p[j]] = 1;
42             if (i % p[j] == 0){
43                 u[K] = 0;
44                 break;
45             }else u[K] = -u[i];
46         }
47     }
48     for (i = 2; i < N; ++i)
49         u[i] += u[i - 1];
50 }
51
52 ll work(int n, int m, int k){
53     n /= k, m /= k;
54     if (n > m) swap(n, m);
55     ll res = 0;
56     int i, last;
57     for (i = 1; i <= n; i = last + 1){
58         last = min(n / (n / i), m / (m / i));
59         res += (ll) (u[last] - u[i - 1]) * (n / i) * (m / i);
60     }
61     return res;
62 }
63
64 int main(){
65     T = read();
66     pre_work();
67     int a, b, c, d, k;
68     ll ans;
69     while (T--){
70         a = read(), b = read(), c = read(), d = read(), k = read();
71         ans = work(b, d, k) - work(a - 1, d, k) - work(b, c - 1, k) + work(a - 1, c - 1, k);
72         printf("%lld\n", ans);
73     }
74     return 0;
75 }

时间: 2024-10-21 05:45:22

BZOJ2301 [HAOI2011]Problem b的相关文章

bzoj2301 [HAOI2011]Problem b【莫比乌斯反演 分块】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 很好的一道题.首先把每个询问转化为4个子询问,最后的结果就是这四个子询问的记过加加减减,类似二维前缀和.那么问题转化为在1 <= x <= lmtx, 1 <= y <= lmty时gcd(x, y) == k的对数,这个问题在转化一下,转化成1 <= x <= lmtx / k,1 <= y <= lmty / k时x与y互质的对数.莫比乌斯反

BZOJ2301: [HAOI2011]Problem b 莫比乌斯反演

分析:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 然后对于求这样单个的gcd(x,y)=k的,我们通常采用莫比乌斯反演 但是,时间复杂度是O(n*(n/k))的,当复杂度很坏的时候,当k=1时,退化到O(n^2),超时 然后进行分块优化,时间复杂度是O(n*sqrt(n)) #include<cstdio> #include<cstring> #include<queue

bzoj2301: [HAOI2011]Problem b懵逼乌斯反演

属于结果的和好求但是结果不好求的题 (轻易能得到以k的倍数为最大公约数的对数,但是不好直接求k) 所以一波反演结束 其实反演的时候完全没有反演的感觉,就是不停地恒等变形 算是懵逼乌斯反演最简单的例题 1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,m,a,b,c,d,k,mu[50001],p[50001];bool o[50001]; 4 int calc(int n,int m) 5 { 6 int ret=0;if(n&

[bzoj2301: [HAOI2011]Problem b] 求

</pre><pre code_snippet_id="507886" snippet_file_name="blog_20141104_2_5383199" name="code" class="cpp">#include <iostream> #include <algorithm> #include <vector> #include <map> #

[bzoj2301: [HAOI2011]Problem b] 乞讨

</pre><pre code_snippet_id="507886" snippet_file_name="blog_20141104_2_5383199" name="code" class="cpp">#include <iostream> #include <algorithm> #include <vector> #include <map> #

BZOJ 2301([HAOI2011]Problem b-mobius反演)

2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 2170  Solved: 934 [Submit][Status][Discuss] Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Out

BZOJ 2302: [HAOI2011]Problem c( dp )

dp(i, j)表示从i~N中为j个人选定的方案数, 状态转移就考虑选多少人为i编号, 然后从i+1的方案数算过来就可以了. 时间复杂度O(TN^2) --------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long lo

[BZOJ 2301] [HAOI2011] Problem b

2301: [HAOI2011]Problem b Time Limit: 50 SecMemory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Output 共n行,每行一个整数表示满足要求的数对(x,y)的个数 Sample Input 2 2 5 1 5

BZOJ 2301 [HAOI2011]Problem b (容斥+莫比乌斯反演+分块优化 详解)

2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 2096  Solved: 909 [Submit][Status][Discuss] Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Out