题意:给定一个11~nn的全排列AA,若干个询问,每次询问给出一个区间[l,r][l,r],要求得出∑l≤i<j≤r  gcd(Ai,Aj)的值。

解法:这题似乎做的人不是很多,蒟蒻当然不会做只能看题解了qwq,目前看到一个比较好的题解是https://blog.csdn.net/Maxwei_wzj/article/details/79355887

没什么好说的,首先必须先推式子。

那么这一坨东西到底是什么意思呢?其实就是对于每个数d,sigma[d|ai][d|aj] 是从区间[l,r]中选两个数且都有约数d的方案数,然后phi(d)乘以这个方案数,对所有的d求和就是答案了。

然后问题是怎么求从区间[l,r]中选两个数且都有约数d的方案数?考虑[l,r]中的数存在约数d的数个数为c[d],那么显然方案数就是c[d]*(c[d]-1)/2。那么问题又变成了怎么快速维护[l,r]中的数存在约数d的数个数呢?对于这题只有询问的题目我们可以考虑使用莫队算法:先预处理每个数的约数,然后每增加/减少一个数就枚举它的所有约数计算贡献即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e4+,B=;
#define bel(x) ((x-1)/B+1)
int n,m,a[N]; LL sum,c[N],ans[N];
struct query{
int id,l,r;
bool operator < (const query &rhs) const {
return bel(l)==bel(rhs.l) ? r<rhs.r : l<rhs.l; //询问排序顺序
}
}q[N]; bool notp[N];
int pnum, p[N], phi[N];
vector<int> fac[N];
void prework(int n) {
memset(notp, , sizeof notp); pnum = ;
phi[]=;
for (int i = ; i <= n; i++) {
if (!notp[i]) {
p[pnum++] = i;
phi[i] = i - ;
}
for (int j = ; j < pnum && i * p[j] <= n; j++) {
int k = i * p[j]; notp[k] = ;
if (i % p[j] == ) {
phi[k] = phi[i] * p[j];
break;
}
phi[k] = phi[i] * (p[j] - );
}
}
for (int i=;i<=n;i++)
for (int j=i;j<=n;j+=i)
fac[j].push_back(i);
} void add(int x) { //添加操作
for (int i=;i<fac[x].size();i++) {
int y=fac[x][i];
sum+=c[y]*phi[y];
c[y]++;
}
} void del(int x) { //删除操作
for (int i=;i<fac[x].size();i++) {
int y=fac[x][i];
c[y]--;
sum-=c[y]*phi[y];
}
} void solve() { //莫队算法
int pl=,pr=; sum=;
for (int i=;i<=m;i++) {
while (pl<q[i].l) del(a[pl++]);
while (pl>q[i].l) add(a[--pl]);
while (pr<q[i].r) add(a[++pr]);
while (pr>q[i].r) del(a[pr--]);
ans[q[i].id]=sum;
}
} int main()
{
prework();
int T,cas=; cin>>T;
while (T--) {
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for (int i=;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+,q+m+);
for (int i=;i<=n;i++) c[i]=;
solve();
printf("Case #%d:\n",++cas);
for (int i=;i<=m;i++) printf("%lld\n",ans[i]);
}
return ;
}

最新文章

  1. 数据结构-浙大 MOOC 笔记一 基本概念
  2. STM32端口复用和映射
  3. React 入门实例教程(转载)
  4. springmvc的xml版本和注解版本
  5. Educational Codeforces Round 7 A. Infinite Sequence 水题
  6. Android 打勾显示输入的密码
  7. Go 接口转换的一个例子
  8. HDOJ/HDU 2352 Verdis Quo(罗马数字与10进制数的转换)
  9. HTTP协议是什么?(及get和post请求的区别)
  10. uva 11210 Chinese Mahjong(暴力搜索)
  11. 【Leetcod】Unique Binary Search Trees II
  12. 读阿里巴巴Java开发手册v1.2.0之工程结构有感【架构篇】
  13. dev和master合并冲突解决
  14. CSS效果:CSS改变下拉列表select框的默认样式
  15. 定时任务APScheduler
  16. 【BZOJ2424】[HAOI2010]订货(费用流)
  17. Ubuntu系统的安装(虚拟机) 并配置C/C++编译器
  18. windows下通过VNC图形化访问Ubuntu桌面环境
  19. 【Android归纳】开发中应该注意的事项
  20. 关于Unity中的NGUI精灵

热门文章

  1. Change the environment variable for python code running
  2. flume(2)
  3. U盘安装win8(win7)+centos7双系统
  4. string 、char* 、 char []的转换
  5. pom里引入lib下的包后编译报 package com.sun.crypto.provider does not exist问题解决
  6. Hive学习之路(三)Hive处理中文乱码
  7. 台哥原创:java 数独源码
  8. react-native 异常处理 Execution failed for task &#39;:app:mergeDebugResources&#39;.
  9. 【Unity 系统知识】 各种路径
  10. Bootstrap 学习笔记5 进度条媒体对象和well组件