通过一个题目,学到了很多。

题意为给你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的更多相关文章

  1. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  2. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...

  3. 【swift】BlockOperation和GCD实用代码块

    //BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...

  4. 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...

  5. GCD的相关函数使用

    GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...

  6. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  7. hdu2588 GCD (欧拉函数)

    GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数.  (文末有题) 知 ...

  8. BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discu ...

  9. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

随机推荐

  1. 20155301 2016-2017-2 《Java程序设计》第10周学习总结

    20155301 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络: 1.在计算机网络中,现在命名IP地址的规定是IPv4协议,该协议规定每个IP ...

  2. day 3 私有属性,私有方法,__del__

    1.隐藏对象的属性 如果有一个对象,当需要对其进行修改属性时,有2种方法 对象名.属性名 = 数据 ---->直接修改 对象名.方法名() ---->间接修改 1)版本1:直接修改 对象的 ...

  3. 【LG3723】[AHOI2017/HNOI2017]礼物

    [LG3723][AHOI2017/HNOI2017]礼物 题面 洛谷 题解 首先我们将\(c\)看作一个可以为负的整数,那么我们就可以省去讨论在哪个手环加\(c\)的繁琐步骤了 设我们当前已经选好了 ...

  4. SRM First Problem && SRM 638 250pts NamingConvention

    NamingConvention 题意: 给一个字符串,删掉所有的'_',然后将‘_'后的第一个字符改成大写. 代码: #include<bits/stdc++.h> using name ...

  5. Linux安装gitlab

    一.GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.安装方法是参考GitLab在GitHub上的Wiki页面. 二.我相信使用过git的开 ...

  6. cogs62 [HNOI2004] 宠物收养所

    cogs62 [HNOI2004] 宠物收养所 啦啦啦啦 不维护区间的平衡树题都是树状数组+二分练手题! 不会的参考我的普通平衡树的多种神奇解法之BIT+二分答案 // It is made by X ...

  7. javascript 强制转换规则 boolean 布尔值类型

    摘自 <你不知道的Javascript(中卷)> p55 一句话简述, 假值表以外的值均可以认为是真值,部分浏览器可能自定义了假值表以外的假值,并不符合W3C规范,需要特殊对待. 首先也是 ...

  8. day02——作业讲解

    # 设定⼀个理想数字⽐如:66,让⽤户输⼊数字,如果⽐66⼤,则显示猜测# 的结果⼤了:如果⽐66⼩,则显示猜测的结果⼩了;只有等于66,显示猜测结果# 正确,然后退出循环 #升级版# 可以帮我们生成 ...

  9. RedHat yum源配置

    RedHat yum源配置 原本以为Redhat7 和Centos7是完全一样的,可是安装完Redhat7以后,使用yum安装软件,提示红帽操作系统未注册.在网上搜索教程,最后成功解决,解决方式是将y ...

  10. Python基础灬序列(字符串、列表、元组)

    序列 序列是指它的成员都是有序排列,并且可以通过下标偏移量访问到它的一个或几个成员.序列包含字符串.列表.元组. 字符串 chinese_zodiac = '鼠牛虎兔龙蛇马羊猴鸡狗猪' print(c ...