博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 5726
阅读量:5245 次
发布时间:2019-06-14

本文共 2356 字,大约阅读时间需要 7 分钟。

GCD

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 4549    Accepted Submission(s): 1630


Problem Description
Give you a sequence of 
N(N100,000) integers : 
a1,...,an(0<ai1000,000,000). There are 
Q(Q100,000) queries. For each query 
l,r you have to calculate 
gcd(al,,al+1,...,ar) and count the number of pairs
(l,r)(1l<rN)such that 
gcd(al,al+1,...,ar) equal 
gcd(al,al+1,...,ar).
 

Input
The first line of input contains a number 
T, which stands for the number of test cases you need to solve.
The first line of each case contains a number 
N, denoting the number of integers.
The second line contains 
N integers, 
a1,...,an(0<ai1000,000,000).
The third line contains a number 
Q, denoting the number of queries.
For the next 
Q lines, i-th line contains two number , stand for the 
li,ri, stand for the i-th queries.
 

Output
For each case, you need to output “Case #:t” at the beginning.(with quotes, 
t means the number of the test case, begin from 1).
For each query, you need to output the two numbers in a line. The first number stands for 
gcd(al,al+1,...,ar) and the second number stands for the number of pairs
(l,r) such that 
gcd(al,al+1,...,ar) equal 
gcd(al,al+1,...,ar).
 

Sample Input
 
1 5 1 2 4 6 7 4 1 5 2 4 3 4 4 4
 

Sample Output
 
Case #1: 1 8 2 4 2 4 6 1
 

Author
HIT
 

Source

思路:定义f[i][j]为:ai开始,连续2^j个数的最大公约数,令k=log2(r-l+1),

         则look(l,r)=gcd(f[l][k],f[r-(1<<k)+1][k])(f[l][k] 和 f[r-(1<<k)+1][k]可能会有重叠,但不影响最终的gcd值。)

        对于第二问,枚举i(1-n),二分j, i-j都是同一个gcd值,然后直接加到map中。

#include
#include
#include
using namespace std;int f[100010][18];int a[100010];int n,m;int gcd(int a,int b){ return b?gcd(b,a%b):a;}void rmq(){ for(int j=1;j<=n;j++) f[j][0]=a[j]; for(int i=1;i<18;i++) { for(int j=1;j<=n;j++) { if(j+(1<
<=n) f[j][i]=gcd(f[j][i-1],f[j+(1<
mp;void ta(){ mp.clear(); for(int i=1;i<=n;i++) { int g=f[i][0],j=i; while(j<=n) { int l=j,r=n; while(l
>1; if(look(i,mid)==g) l=mid; else r=mid-1; } mp[g]+=l-j+1; j=l+1; g=look(i,j); } }}int main(){ int t,l,r; int cas=1; scanf("%d",&t); while(t--) { printf("Case #%d:\n",cas++); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); rmq(); ta(); scanf("%d",&m); for(int i=0;i

转载于:https://www.cnblogs.com/The-Pines-of-Star/p/9878841.html

你可能感兴趣的文章
[Leetcode Week8]Edit Distance
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
ASP.NET 3.5构建Web 2.0门户站点
查看>>
PP tables for production order
查看>>
oam系统安装,windows操作系统注册列表影响系统安装
查看>>
[scrum]2011/9/25-----第五天
查看>>
《人月神话》有感,好书,推荐
查看>>
IE浏览器打开chorme浏览器,如何打开其他浏览器
查看>>
GNU 内联汇编
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
php提交表单校验例子
查看>>
man查看帮助命令
查看>>
【SVM】libsvm-python
查看>>
mysql 修改已存在的表增加ID属性为auto_increment自动增长
查看>>
sgu 109 Magic of David Copperfield II
查看>>
C++循环单链表删除连续相邻重复值
查看>>
IIS 7.5 + PHP-5.6.3 + mysql-5.6.21.1(转载)
查看>>
渣渣小本求职复习之路每天一博客系列——Java基础(3)
查看>>
C#调用WIN32 的API函数--USER32.DLL
查看>>
ListView下拉刷新实现
查看>>