hdu 4676 Sum Of Gcd
离线+分块!!
思路:序列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的更多相关文章
- 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 莫队+phi反演
Sum Of Gcd 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4676 Description Given you a sequence of ...
- hdu 4676 Sum Of Gcd 莫队+数论
题目链接 给n个数, m个询问, 每个询问给出[l, r], 问你对于任意i, j.gcd(a[i], a[j]) L <= i < j <= R的和. 假设两个数的公约数有b1, ...
- 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 ...
- Sum Of Gcd(hdu 4676)
Sum Of Gcd Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- 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 ...
随机推荐
- java.util.TreeMap源码分析
TreeMap的实现基于红黑树,排列的顺序根据key的大小,或者在创建时提供的比较器,取决于使用哪个构造器. 对于,containsKey,get,put,remove操作,保证时间复杂度为log(n ...
- 利用rsyslog 对linux 操作进行审计
环境:客户端和服务端都需要安装rsyslog服务 rsyslog server端 cd /etc/rsyslog.d/ cat server.conf $ModLoad imtcp $InputTC ...
- Dynamic - ExpandoObject学习心得
1. 今天下午在做开发过程中,遇到了一个问题,要往Xml文件中添加新的节点,做个xml开发的都知道该怎么做,这不是什么难事,我卡卡卡卡把这个问题解决了,但是新问题又来了,要对xml中对应的节点数据添 ...
- JS判断鼠标从什么方向进入一个容器
偶然将想到的一个如何判断鼠标从哪个方向进入一个容器的问题.首先想到的是给容器的四个边添加几个块,然后看鼠标进入的时候哪个块先监听到鼠标事件.不过这样麻烦太多了.google了一下找到了一个不错的解决方 ...
- centOS 一键php环境安装-php博弈
我是方少,闲着没事,感觉每次编译安装,再修改php,mysql,redis,nginx配置文件觉得把大好的青春时间都浪费掉了.如是想着,怎样一键安装 php环境和相关配置.于是拜读了一下lnmp的一键 ...
- C程序调用shell脚本共有三种方法
C程序调用shell脚本共有三种法子 :system().popen().exec系列函数call_exec1.c ,内容为:system() 不用你自己去产生进程,它已经封装了,直接加入自己的命令e ...
- python的各种推导式(列表推导式、字典推导式、集合推导式)
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- java dom4j解析xml用到的几个方法
1. 读取并解析XML文档: SAXReader reader = new SAXReader(); Document document = reader.read(new File(fileName ...
- Nginx+uWSGI+Django原理
Python的Web开发中,如果使用Django框架,那么较为成熟稳定的服务器架构一般是Nginx+uWSGI+Django.而为什么一定要三个结合在一起呢?直接使用Django的runserver来 ...
- 把数组排成最小的数/1038. Recover the Smallest Number
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. Give ...