离线+分块!!

思路:序列a[1],a[2],a[3]……a[n]

num[i]表示区间[L,R]中是i的倍数的个数;euler[i]表示i的欧拉函数值。

则区间的GCD之和sum=∑(C(num[i],2)*euler[i]).当增加一个数时,若有约数j,则只需加上num[j]*euler[j],之后再num[j]++;

反之亦然!!

代码如下:

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 20002
using namespace std;
int R,L,an[MAX],euler[MAX],ans[MAX],res,num[MAX];
bool vis[MAX],prime[MAX];
struct node
{
int x,y,l,p;
}q[MAX];
vector<int>p[MAX];
void init()//初始化欧拉函数值
{
int i,j;
for(i=;i<MAX;i++) euler[i]=i;
for(i=;i<MAX;i++)
if(euler[i]==i){
for(j=i;j<MAX;j+=i)
euler[j]=euler[j]/i*(i-);
}
}
void factor(int n)//分解因子
{
p[n].clear();
for(int i=;i*i<=n;i++){
if(n%i==){
p[n].push_back(i);
if(i*i!=n) p[n].push_back(n/i);
}
}
}
bool cmp(const node &a,const node &b)
{
if(a.l==b.l) return a.y<b.y;
return a.l<b.l;
}
void query(int x,int y,int flag)//查询操作
{
int t;
if(flag){
for(int i=x;i<L;i++){
for(int j=;j<p[an[i]].size();j++){
t=p[an[i]][j];
res+=num[t]*euler[t];
num[t]++;
}
}
for(int i=L;i<x;i++){
for(int j=;j<p[an[i]].size();j++){
t=p[an[i]][j];
num[t]--;
res-=num[t]*euler[t];
}
}
for(int i=y+;i<=R;i++){
for(int j=;j<p[an[i]].size();j++){
t=p[an[i]][j];
num[t]--;
res-=num[t]*euler[t];
}
}
for(int i=R+;i<=y;i++){
for(int j=;j<p[an[i]].size();j++){
t=p[an[i]][j];
res+=num[t]*euler[t];
num[t]++;
}
}
}
else{
for(int i=x;i<=y;i++){
for(int j=;j<p[an[i]].size();j++){
t=p[an[i]][j];
res+=num[t]*euler[t];
num[t]++;
}
}
}
L=x;R=y;
}
int main(){
int n,t,i,j,m,c,ca=;
init();
for(i=;i<=;i++) factor(i);
scanf("%d",&c);
while(c--){
scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d",&an[i]);
m=sqrt(1.0*n);
scanf("%d",&t);
for(i=;i<t;i++){
scanf("%d%d",&q[i].x,&q[i].y);
q[i].l=q[i].x/m;
q[i].p=i;
}
sort(q,q+t,cmp);
res=;
memset(num,,sizeof(num));
for(i=;i<t;i++){
query(q[i].x,q[i].y,i);
ans[q[i].p]=res;
}
printf("Case #%d:\n",++ca);
for(i=;i<t;i++)
printf("%d\n",ans[i]);
}
return ;
}

hdu 4676 Sum Of Gcd的更多相关文章

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

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

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

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

  3. hdu 4676 Sum Of Gcd 莫队+数论

    题目链接 给n个数, m个询问, 每个询问给出[l, r], 问你对于任意i, j.gcd(a[i], a[j]) L <= i < j <= R的和. 假设两个数的公约数有b1, ...

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

  5. Sum Of Gcd(hdu 4676)

    Sum Of Gcd Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

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

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

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

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

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

随机推荐

  1. Tables for condition techniques

    T682i  -- Access sequence and the tables   T685  -- Condition types and Access sequences   T683s  -- ...

  2. 使用HttpWebRequest以及HttpWebResponse读取Http远程文件

     主页>杂项技术>.NET(C#)> 使用HttpWebRequest以及HttpWebResponse读取Http远程文件 jackyhwei 发布于 2010-08-15 21: ...

  3. jQuery 添加元素和删除元素

    jQuery - 添加元素 append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元 ...

  4. jQuery ui datepicker 日历转中文

    做个笔记,以后详解 jQuery(function($){ $.datepicker.regional['zh-CN'] = { closeText: '关闭', prevText: '<上月' ...

  5. 从0零开始学slatstack-(0)在centos 6.5 安装 python2.7 salt

    由于服务器环境问题,我的一个小玩意失败了,于是下决心学习下saltstack来弄个好使的自动化配置管理工具.之所以不考虑puppet等,主要原因是我不熟ruby,深入学习困难.再其次,为什么考虑2.7 ...

  6. JS判断鼠标从什么方向进入一个容器

    偶然将想到的一个如何判断鼠标从哪个方向进入一个容器的问题.首先想到的是给容器的四个边添加几个块,然后看鼠标进入的时候哪个块先监听到鼠标事件.不过这样麻烦太多了.google了一下找到了一个不错的解决方 ...

  7. Mysql备份--mysqldump&outfile

    1.备份工具mysqldump 客户端和服务器端都能用select outfile 只能写到服务器端 2.按表单位备份 a.单个表备份 mysqldump -uusername -p database ...

  8. Python中docstring文档的写法

    该写法根据Python的PEP 257文档总结. 类的函数称为方法(method),模块里的函数称为函数(function) 每一个包,模块,类,函数,方法都应该包含文档,包括类的__init__方法 ...

  9. 1. opencv的初体验

    http://guoming.me/opencv-config  这篇文章有讲解opencv的安装与配置 一些常用库 opencv_core249d.lib opencv_imgproc249d.li ...

  10. SQL Server 本地语言版本

    要一些实验是往往喜欢使用英文的Windows 以及SQL Server ,但有时需要使用中文的环境方便理解.中文的SQL Server 不能被安装在英文的Windows 系统上. 根据文档可得知以下兼 ...