HDU4767_Sum Of Gcd
通过一个题目,学到了很多。
题意为给你n个数,每次询问i,j,答案为i,j间任取两数所有的取法gcd的和。
假设我们当前要看看这个区间有多少个数的gcd为x,最最原始的想法都是查询这个区间有多少个数为x的倍数。然后任取两个%&*¥#@!,但是有的gcd不是x,而是x的倍数。
这个问题这样来考虑,其实思想上是莫比乌斯反演。
假设当前我们有x个数是要求的现在的数y的倍数,那么所有的y的约数也肯定包含了这x个数。
所以我们可以当前要乘以的这个数不是x,而是一个f[x],显然x的所有的约数的函数和为x,这样就保证了求解的正确性。
同时想到了这里就会发现,所求的函数值与原题给的数据和各个数字的位置关系是没有关系的了,可以预处理。
最后看过各种,终于学到了,这个函数值就是欧拉函数值。 神坑啊。
还有就是这里的区间求解有一个小小的技巧。
区间分块处理,什么意思呢?
把区间排序,每次按照区间左端点所在的区进行排序,如果在同一区的话,就按右端点来排序,这样就保证了更新的复杂度为n*sqrt(n)。
真心受教了,不过鄙人还是觉得这种做法不太严谨,感觉如果是这个题目有极限数据的话,还是会T,不过确实比我想过的所有其他的想法都要优。
数论又一次被虐了。。。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cmath>
#define maxn 20002
typedef long long ll;
using namespace std; vector<int> g[maxn];
ll sum[maxn],ans;
int num[maxn],a[maxn],phi[maxn],t,n,m,Q,cas=,curl,curr; struct query{
int li,ri,pos;
}q[maxn]; bool cmp(query q1,query q2)
{
int l1=q1.li/m,l2=q2.li/m;
if (l1==l2) return q1.ri<q2.ri;
return q1.li<q2.li;
} void init()
{
for (int i=; i<maxn; i++)
for (int j=i; j<maxn; j+=i) g[j].push_back(i);
phi[]=;
for (int i=; i<maxn; i++)
{
if (phi[i]==) phi[i]=i;
else continue;
for (int j=i; j<maxn; j+=i)
{
if (phi[j]==) phi[j]=j;
phi[j]=phi[j]/i*(i-);
}
}
} void add(int x,int tag)
{
for (unsigned i=; i<g[x].size(); i++)
{
int k=g[x][i];
if (tag==-) num[k]--;
ans+=(ll)tag*num[k]*phi[k];
if (tag== ) num[k]++;
}
} void _process()
{
ans=;
memset(num,,sizeof num);
curl=q[].li,curr=q[].ri;
for (int i=curl; i<=curr; i++) add(a[i],);
sum[q[].pos]=ans;
for (int i=; i<=Q; i++)
{
while (curl<q[i].li) add(a[curl],-),curl++;
while (curr>q[i].ri) add(a[curr],-),curr--;
while (curl>q[i].li) add(a[--curl], );
while (curr<q[i].ri) add(a[++curr], );
sum[q[i].pos]=ans;
}
} int main()
{
init();
scanf("%d",&t);
while (t--)
{
scanf("%d",&n); m=(int)sqrt(n+0.5);
for (int i=; i<=n; i++) scanf("%d",&a[i]);
scanf("%d",&Q);
for (int i=; i<=Q; i++) scanf("%d%d",&q[i].li,&q[i].ri),q[i].pos=i;
sort(q+,q++Q,cmp);
_process();
printf("Case #%d:\n",++cas);
for (int i=; i<=Q; i++) printf("%I64d\n",sum[i]);
}
return ;
}
HDU4767_Sum Of Gcd的更多相关文章
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- GCD的相关函数使用
GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...
- hdu1695 GCD(莫比乌斯反演)
题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1624 Solved: 853[Submit][Status][Discu ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
随机推荐
- 洛谷 P1876 开灯
传送门 这道题凭什么是! 就因为它代码短?! 还是我太菜了... 第$i$盏灯的开关与否只由其约数个数决定,又有约数公式: 当$n=p_1^{a_1}p_2^{a_2}...p_n^{a_n}$时,约 ...
- LVS入门篇(四)之LVS实战
一.LVS的NAT模式实战 1.环境说明: HOST OS role remask 192.168.56.12 Centos 7.4 LVS调度器(1.2.7) VIP:192.168.0.104 1 ...
- [WC2010]重建计划 长链剖分
[WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...
- char和String 在jsp java代码中与jstl代码中的区别
在 jsp java代码中 '0' ,这种代表char 在jstl中 '0' 会被解释为 String 所以也可以用 .equals 方法
- hive 空值、NULL判断
hive中空值判断基本分两种 (1)NULL 与 \N hive在底层数据中如何保存和标识NULL,是由 alter table name SET SERDEPROPERTIES('serializa ...
- Airflow使用入门指南
Airflow能做什么 关注公众号, 查看更多 http://mp.weixin.qq.com/s/xPjXMc_6ssHt16J07BC7jA Airflow是一个工作流分配管理系统,通过有向非循环 ...
- c++中的stack实现
通用.类型安全.模板 简直就是巧夺天工的例子
- 我们一起学习WCF 第五篇数据协定和消息协定
A:数据协定(“数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每个参数或 ...
- javaweb(三十九)——数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- 180726-InfluxDB基本概念小结
InfluxDB基本概念小结 InfluxDB作为时序数据库,与传统的关系型数据库相比而言,还是有一些区别的,下面尽量以简单明了的方式介绍下相关的术语概念 I. 基本概念 mysql influxdb ...