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 ...
随机推荐
- C++面试基础篇(一)
1. static关键字的作用 (1)全局静态变量 在全局变量前面加上关键字static, 全局变量就定义为一个全局静态变量 在静态存储区,在整个程序运行期间一致存在. 初始化:未初始化的全局静态变量 ...
- Docker环境中部署Prometheus及node-exporter监控主机资源
前提条件 已部署docker 已部署grafana 需要开放 3000 9100 和 9090 端口 启动node-exporter docker run --name node-exporter - ...
- C语言之内核中的struct list_head 结构体
以下地址文章解释很好 http://blog.chinaunix.net/uid-27122224-id-3277511.html 对下面的结构体分析 1 struct person 2 { 3 in ...
- LeetCode最富有客户的资产总量
最富有客户的资产总量 题目描述 给你一个 m * n 的整数网格 accounts,其中 account[i][j]是第 i 位客户在第 j 家银行托管的资产数量.返回最富有客户所拥有的资产总量. 客 ...
- 【leetcode】 450. Delete Node in a BST
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...
- oracle加密encrypt,解密decrypt
目录 oracle加密encrypt,解密decrypt 加密 解密 oracle加密encrypt,解密decrypt 有的oracle版本没有加解密函数,以下操作可以手动添加 oracle数据使用 ...
- collection映射
讲了manyToOne和oneToMany,下面来看看get方法.在之前已经说过,如果是映射单对象,直接使用association来映射.而如果关系 是一个集合,则需要使用collection来描述. ...
- oracle 根据ids转names
WITH t AS (SELECT '1,2,3,4' a, 1 b FROM Dual UNION ALL SELECT '1,2,3' a, 2 b FROM Dual),p AS ( ...
- 基本类型、引用类型NPE异常
1.null是Java中的关键字,像public.static.final.它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错. 2.就像每种原始类型都有默认值一样 ...
- CountDownLatch原理
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.在Java并发中,countdownlatch的概念是一 ...