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 ...
随机推荐
- Python的 is 运算符
1. is运算符判断的是同一性而不是相等性. #x和y都绑定到同一个列表,而z被绑定在另外一个具有相同数值和顺序的列表上 x = y = [1, 2, 3] z = [1, 2, 3] x == y ...
- 躲避球游戏ios源码
躲避球游戏源码,有限源码是一个基于cocos2d的躲避球游戏源码的,并且还引用了大家熟悉google广告的,进行推广,已经还有带game center等,游戏操作很简单,用手指按住物体,然后移动物体避 ...
- Asp.net 生成验证码
生成验证码一般来说大体有这么几步: 1.生成验证码字符串,一般由四个或更多随机字符拼凑而成: 2.填充图片背景,并绘制图片的背景噪音线: 3.将验证码绘制到图片中: 4.绘制前景噪点: 5.返回图片流 ...
- 《Linux系统静态路由和火墙路由》
本篇主要写的是关于静态路由表的添加,和如何让你不能上网的主机通过火墙路由表实现上网的功能. 静态路由表: 要是你的主机是2块网卡,并且做了网卡的绑定,依照我下面的方法是成功不了的,你可以去编辑: # ...
- win7 php5.5 apache 源码安装 imagick扩展
最近公司项目有用到php 的imagick,折腾了好长时间才把扩展装上,最主要的就是最新的不一定是最合适的,最开始一直找最新包安装,一直都不成功,经过google了好长时间,终于找到一个有用的,灵机一 ...
- 在项目中 background transiton 带来的"便利"与“坑”
本文就两个例子跟大家分享一下background-image与background-size的渐变(transition)所带来的方便与“深坑” 首选,说说这东西好的地方,有时候在做PC项目的时候,可 ...
- PHP流程控制语句
流程控制语句分为两种(自己学到的就有俩不过在网上看还有两种) 1:条件控制语句即(if, if else , elseif , switch case) if语句不多说了,基本上大家都知道.if el ...
- ajax 设置Access-Control-Allow-Origin实现跨域访问
ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全. 即使使用jquery的jsonp方法,t ...
- 失败经历--在windows下安装meld
缘起 在linux下,最早用的比较工具是vim,这是作为一个vimer的自尊(其实没有关系吧).终于有一天,在比较同一个项目的两个版本的时候,比较了两三个文件后,看着vim里面花花绿绿的颜色,实在是受 ...
- ORA-00845
系统版本: [root@yoon ~]# more /etc/oracle-releaseOracle Linux Server release 5.7 数据库版本: Oracle Database ...