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

Problem Description
Given you a sequence of number a1, a2, ..., an, which is a permutation of 1...n.
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.
 
Input
First line contains a number T(T <= 10),denote the number of test cases.
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.
 
Output
For each case, first you should print "Case #x:", where x indicates the case number between 1 and T.
Then for each query print the answer in one line.
 
Sample Input
1
5
3 2 5 4 1
3
1 5
2 4
3 3
 
Sample Output
Case #1:
11
4
0
 思路:莫比乌兹反演+莫队;
 
然后后面的s(d)就是欧拉函数;
然后用莫队算法维护下;
  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)的更多相关文章

  1. hdu 4676 Sum Of Gcd 莫队+phi反演

    Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...

  2. HDU 4676 Sum Of Gcd 【莫队 + 欧拉】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=4676 Sum Of Gcd Time Limit: 10000/5000 MS (Java/Others ...

  3. 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 ...

  4. 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 ...

  5. hdu 5381 The sum of gcd(线段树+gcd)

    题目链接:hdu 5381 The sum of gcd 将查询离线处理,依照r排序,然后从左向右处理每一个A[i],碰到查询时处理.用线段树维护.每一个节点表示从[l,i]中以l为起始的区间gcd总 ...

  6. 【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= ...

  7. 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 ...

  8. 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 ...

  9. D - GCD HDU - 1695 -模板-莫比乌斯容斥

    D - GCD HDU - 1695 思路: 都 除以 k 后转化为  1-b/k    1-d/k中找互质的对数,但是需要去重一下  (x,y)  (y,x) 这种情况. 这种情况出现 x  ,y ...

随机推荐

  1. EXCEL-REPLACE()替换字符串最后几位 删除字符串最后几位

    字符串    0M5(烈焰红) 我要删除最后一个字符")" 公式=REPLACE(ASC(字符串),LEN(ASC(字符串)),1,"") 解释:=REPLAC ...

  2. html5的canvas鼠标点击画圆

    <!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...

  3. 重新整理 .net core 实践篇——— endpoint[四十七]

    前言 简单整理一些endpoint的一些东西,主要是介绍一个这个endpoint是什么. 正文 endpoint 从表面意思是端点的意思,也就是说比如客户端的某一个action 是一个点,那么服务端的 ...

  4. 巩固javaweb第三天

    巩固内容: HTML 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. HTML 段落 HTML 段落是通过标签 <p> 来定义的 ...

  5. Learning Spark中文版--第六章--Spark高级编程(2)

    Working on a Per-Partition Basis(基于分区的操作) 以每个分区为基础处理数据使我们可以避免为每个数据项重做配置工作.如打开数据库连接或者创建随机数生成器这样的操作,我们 ...

  6. Oracle——概要文件profile

    profile文件详解 一.目的         Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用Create Profile命令创建一个Profile,用它来实现对 ...

  7. 面试 Java 后端开发的感受

    上周,密集面试了若干位Java后端候选人,工作经验在3到5年间.我的标准其实不复杂(适用90%小小小公司,BAT等自动忽略): 第一能干活,第二Java基础要好,第三最好熟悉些分布式框架.我相信其它公 ...

  8. postman 中get传参数

    mybatis中: @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET, produces = & ...

  9. 特定场景下的PLC 远程控制和数据读取

    最近有位博友提出了一种应用场景,根据工作中实际遇到的类似的产品应用场景,记录下自己的解决方案. 场景: 需要在云端控制和采集各个站点的PLC数据.各个站点是分散的,每个站点有公网访问能力,但是分散站点 ...

  10. ICCV2021 | 简单有效的长尾视觉识别新方案:蒸馏自监督(SSD)

    ​  前言  本文提出了一种概念上简单但特别有效的长尾视觉识别的多阶段训练方案,称为蒸馏自监督(Self Supervision to Distillation, SSD).在三个长尾识别基准:Ima ...