Sum Of Gcd(hdu 4676)
Sum Of Gcd
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 738 Accepted Submission(s): 333
You need to answer some queries, each with the following format:
Give you two numbers L, R, you should calculate sum of gcd(a[i], a[j]) for every L <= i < j <= R.
Then follow T test cases.
For each test cases,the first line contains a number n(1<=n<= 20000).
The second line contains n number a1,a2,...,an.
The third line contains a number Q(1<=Q<=20000) denoting the number of queries.
Then Q lines follows,each lines contains two integer L,R(1<=L<=R<=n),denote a query.
Then for each query print the answer in one line.
5
3 2 5 4 1
3
1 5
2 4
3 3
11
4
0

1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<math.h>
6 #include<queue>
7 #include<vector>
8 #include<stack>
9 #include<set>
10 using namespace std;
11 typedef long long LL;
12 int ans[100000];
13 int mul[100000];
14 typedef struct node
15 {
16 int l;
17 int r;
18 int id;
19 } ss;
20 ss ask[100000];
21 bool cmp1(node p,node q)
22 {
23 return p.l < q.l;
24 }
25 bool cmp2(node p,node q)
26 {
27 return p.r < q.r;
28 }
29 bool prime[30000];
30 int prime_table[30000];
31 vector<int>vec[30000];
32 int cnt[20005];
33 LL answ[30000];
34 int oula[20005];
35 void _slove_mo(int n,int m);
36 int main(void)
37 {
38 int n,m;
39 int T;
40 int __ca = 0;
41 int cn = 0;
42 mul[1] = 1;
43 int i,j;
44 memset(prime,0,sizeof(prime));
45 for(i = 0; i <= 20000; i++)
46 oula[i] = i;
47 for(i = 2; i <= 20000; i++)
48 {
49 if(!prime[i])
50 {
51 prime_table[cn++] = i;
52 mul[i] = -1;
53 }
54 for(j = 0; j < cn&&(i*prime_table[j]<=20000); j++)
55 {
56 if(i%prime_table[j])
57 {
58 prime[i*prime_table[j]] = true;
59 mul[i*prime_table[j]] = -mul[i];
60 }
61 else
62 {
63 prime[i*prime_table[j]] = true;
64 mul[i*prime_table[j]] = 0;
65 break;
66 }
67 }
68 }//printf("%d\n",cn);
69 for(i = 0; i < cn; i++)
70 {
71 for(j = 1; j*prime_table[i]<=20000; j++)
72 {
73 oula[j*prime_table[i]]/=prime_table[i];
74 oula[j*prime_table[i]]*=(prime_table[i]-1);
75 }
76 }
77 for(i = 1; i <= 20000; i++)
78 {
79 for(j = 1; j <= sqrt(i); j++)
80 {
81 if(i%j==0)
82 {
83 vec[i].push_back(j);
84 if(i/j != j)
85 vec[i].push_back(i/j);
86 }
87 }
88 }scanf("%d",&T);
89 while(T--)
90 {
91 ++__ca; memset(cnt,0,sizeof(cnt));
92 scanf("%d",&n);
93 for(i = 1; i <= n; i++)
94 {
95 scanf("%d",&ans[i]);
96 }
97 scanf("%d",&m);
98 for(i = 0; i < m; i++)
99 {
100 scanf("%d %d",&ask[i].l,&ask[i].r);
101 ask[i].id = i;
102 }
103 sort(ask,ask+m,cmp1);
104 int id = 0;
105 int ak = sqrt(1.0*n)+1;
106 int v = ak;
107 for(i = 0; i < m; i++)
108 {
109 if(ask[i].l > v)
110 {
111 v += ak;
112 sort(ask+id,ask+i,cmp2);
113 id = i;
114 }
115 }
116 sort(ask+id,ask+m,cmp2);
117 _slove_mo(n,m);
118 printf("Case #%d:\n",__ca);
119 for(i = 0; i < m; i++)
120 printf("%lld\n",answ[i]);
121
122 }return 0;
123 }
124 void _slove_mo(int n,int m)
125 {
126 int i,j;
127 LL sum = 0;
128 int xl = ask[0].l;
129 int xr = ask[0].r;
130 for(i = xl; i <= xr; i++)
131 {
132 for(j = 0; j < vec[ans[i]].size(); j++)
133 { int x = vec[ans[i]][j];
134 sum = sum + (LL)oula[x]*(LL)cnt[x];
135 cnt[x]++;
136 }
137 }
138 answ[ask[0].id] = sum;
139 for(i = 1; i < m; i++)
140 {
141 while(xl < ask[i].l)
142 {
143 int y = ans[xl];
144 for(j = 0; j < vec[y].size(); j++)
145 {
146 int x = vec[y][j];
147 sum -= (LL)oula[x]*(LL)(--cnt[x]);
148 }
149 xl++;
150 }
151 while(xl > ask[i].l)
152 {
153 xl--;
154 int y = ans[xl];
155 for(j = 0; j < vec[y].size(); j++)
156 {
157 int x = vec[y][j];
158 sum += (LL)oula[x]*(LL)(cnt[x]++);
159 }
160 }
161 while(xr > ask[i].r)
162 {
163 int y = ans[xr];
164 for(j = 0; j < vec[y].size(); j++)
165 {
166 int x = vec[y][j];
167 sum -= (LL)oula[x]*(LL)(--cnt[x]);
168 }
169 xr--;
170 }
171 while(xr < ask[i].r)
172 {
173 xr++;
174 int y = ans[xr];
175 for(j = 0; j < vec[y].size(); j++)
176 {
177 int x = vec[y][j];
178 sum += (LL)oula[x]*(LL)(cnt[x]++);
179 }
180 }
181 answ[ask[i].id] = sum;
182 }
183 }
Sum Of Gcd(hdu 4676)的更多相关文章
- hdu 4676 Sum Of Gcd 莫队+phi反演
Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...
- HDU 4676 Sum Of Gcd 【莫队 + 欧拉】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=4676 Sum Of Gcd Time Limit: 10000/5000 MS (Java/Others ...
- HDU - 4676 :Sum Of Gcd (莫队&区间gcd公式)
Given you a sequence of number a 1, a 2, ..., a n, which is a permutation of 1...n. You need to answ ...
- hdu 5381 The sum of gcd 莫队+预处理
The sum of gcd Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) P ...
- hdu 5381 The sum of gcd(线段树+gcd)
题目链接:hdu 5381 The sum of gcd 将查询离线处理,依照r排序,然后从左向右处理每一个A[i],碰到查询时处理.用线段树维护.每一个节点表示从[l,i]中以l为起始的区间gcd总 ...
- 【HDU 5381】 The sum of gcd (子区间的xx和,离线)
[题目] The sum of gcd Problem Description You have an array A,the length of A is nLet f(l,r)=∑ri=l∑rj= ...
- hdu 5381 The sum of gcd 2015多校联合训练赛#8莫队算法
The sum of gcd Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) T ...
- 2015 Multi-University Training Contest 8 hdu 5381 The sum of gcd
The sum of gcd Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- D - GCD HDU - 1695 -模板-莫比乌斯容斥
D - GCD HDU - 1695 思路: 都 除以 k 后转化为 1-b/k 1-d/k中找互质的对数,但是需要去重一下 (x,y) (y,x) 这种情况. 这种情况出现 x ,y ...
随机推荐
- Prometheus概述
Prometheus是什么 首先, Prometheus 是一款时序(time series) 数据库, 但他的功能却并非支部与 TSDB , 而是一款设计用于进行目标 (Target) 监控的关键组 ...
- Flink(九)【Flink的重启策略】
目录 1.Flink的重启策略 2.重启策略 2.1未开启checkpoint 2.2开启checkpoint 1)不设置重启策略 2)不重启 3)固定延迟重启(默认) 4)失败率重启 3.重启效果演 ...
- 大数据学习day13------第三阶段----scala01-----函数式编程。scala以及IDEA的安装,变量的定义,条件表达式,for循环(守卫模式,推导式,可变参数以及三种遍历方式),方法定义,数组以及集合(可变和非可变),数组中常用的方法
具体见第三阶段scala-day01中的文档(scala编程基础---基础语法) 1. 函数式编程(https://www.cnblogs.com/wchukai/p/5651185.html): ...
- C语言time函数获取当前时间
以前放了个链接,但是原作者把博文删了,这里放一个获取时间的代码,已经比较详细所以不做注释 #include<stdio.h> #include<time.h> #include ...
- 在Eclipse中运行OSGI工程出错的解决方案
今天学习OSGI的过程中按照书上所述搭建好第一个helloworld插件工程,运行的过程中出现下面所示的错误: !SESSION 2014-06-09 21:04:49.038 ----------- ...
- Java Log4j 配置文件
### 设置### log4j.rootLogger = debug,stdout,D,E ### 输出信息到控制抬 ### log4j.appender.stdout = org.apache.lo ...
- 【C/C++】旋转数组的最小数字/ 剑指offer
#include <bits/stdc++.h> using namespace std; class Solution { public: int minNumberInRotateAr ...
- 基于Web的质量和测试度量指标
直观了解软件质量和测试的完整性 VectorCAST/Analytics可提供便于用户理解的web仪表盘视图来显示软件代码质量和测试完整性指标,让用户能够掌握单个代码库的趋势,或对比多个代码库的度量指 ...
- Java高精度基础+开根
在焦作站的acm网络赛中遇到了一个高精度开根的水题--但是那时候WA了 后面学写java补题还T了orz 所以写一篇文章来记录一下java的大整数类型的基础和开根还有一点心得体会吧 首先给那一题的题面 ...
- 网络访问控制列表ACL(读懂这篇就基本够了,后面有配置案例)
一.访问控制列表是什么? 访问控制列表(ACL)是一种基于包过滤的访问控制技术,它可以根据设定的条件对接口上的数据包进行过滤,允许其通过或丢弃.访问控制列表被广泛地应用于路由器和三层交换机,借助于访问 ...