gcd区间

本题地址:http://www.luogu.org/problem/show?pid=1890

题目描述

给定一行n个正整数a[1]..a[n]。
m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数。

输入输出格式

输入格式:

第一行两个整数n,m。
第二行n个整数表示a[1]..a[n]。
以下m行,每行2个整数表示询问区间的左右端点。
保证输入数据合法。

输出格式:

共m行,每行表示一个询问的答案。

输入输出样例

输入样例#1:

5 3
4 12 3 6 7
1 3
2 3
5 5

输出样例#1:

1
3
7

说明

对于30%的数据,n <= 100, m <= 10
对于60%的数据,m <= 1000
对于100%的数据,1 <= n <= 1000,1 <= m <= 1,000,000
0 < 数字大小 <= 1,000,000,000

思路

  我们可以用区间维护的方法:如果区间内只有自己,那么GCD就是自己;如果区间内是相邻的两个数,就可以用扩展欧几里德定理;如果区间是不相邻的两个数,那么f[i,j]:=gcd(f[i-1,j],a[j])。然后线上询问处理,时间复杂度O(n^2).

var f:array[1..1000,1..1000] of longint;
    a:array[1..1000] of longint;
    i,j,n,m,x,y:longint;  

function gcd(x,y:longint):longint;
begin
    if y=0 then
        begin
            gcd:=x;
            exit;
        end;
    gcd:=gcd(y,x mod y);
end;  

begin
    fillchar(f,sizeof(f),0);
    readln(n,m);
    for i:=1 to n do read(a[i]);
    for i:=1 to n do f[i,i]:=a[i];
    for i:=1 to n do
        for j:=i+1 to n do
            begin
                if j-i=1 then f[i,j]:=gcd(a[i],a[j])
                else f[i,j]:=gcd(a[j],f[i,j-1]);
            end;
    for i:=1 to m do
        begin
            readln(x,y);
            writeln(f[x,y]);
        end;
end.  
时间: 2024-10-13 22:50:36

gcd区间的相关文章

HDU 5726 GCD 区间GCD=k的个数

GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2742    Accepted Submission(s): 980 Problem Description Give you a sequence of N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000). There ar

洛谷P1890 gcd区间 [2017年6月计划 数论09]

P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表示a[1]..a[n]. 以下m行,每行2个整数表示询问区间的左右端点. 保证输入数据合法. 输出格式: 共m行,每行表示一个询问的答案. 输入输出样例 输入样例#1: 5 3 4 12 3 6 7 1 3 2 3 5 5 输出样例#1: 1 3 7 说明 对于30%的数据,

洛谷——P1890 gcd区间

P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表示a[1]..a[n]. 以下m行,每行2个整数表示询问区间的左右端点. 保证输入数据合法. 输出格式: 共m行,每行表示一个询问的答案. 输入输出样例 输入样例#1: 复制 5 3 4 12 3 6 7 1 3 2 3 5 5 输出样例#1: 复制 1 3 7 说明 对于3

luoguP1890 gcd区间 [st表][gcd]

题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m. 第二行n个整数表示a[1]..a[n]. 以下m行,每行2个整数表示询问区间的左右端点. 保证输入数据合法. 输出格式: 共m行,每行表示一个询问的答案. 输入输出样例 输入样例#1: 5 3 4 12 3 6 7 1 3 2 3 5 5 输出样例#1: 1 3 7 说明 对于30%的数据,n <= 100, m

洛谷1890 gcd区间

题目描述 给定一行n个正整数a[1]..a[n].m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n,m.第二行n个整数表示a[1]..a[n].以下m行,每行2个整数表示询问区间的左右端点.保证输入数据合法. 输出格式: 共m行,每行表示一个询问的答案. 输入输出样例 输入样例#1: 5 3 4 12 3 6 7 1 3 2 3 5 5 输出样例#1: 1 3 7 说明 对于30%的数据,n <= 100, m <=

BZOJ 2818: Gcd区间内最大公约数 为素数的对数(欧拉函数的应用)

传送门 2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Submit: 3649 Solved: 1605 [Submit][Status][Discuss] Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sample Output 4 HINT hint 对于样例(2,2),(2,4),(3,3),(4,

GCD (区间数的质因子打表+容斥原理)

GCD HDU - 1695 Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output the total

P1890 gcd区间 线段树

题目描述 给定一行\(n\)个正整数\(a[1]..a[n]\). \(m\)次询问,每次询问给定一个区间\([L,R]\),输出\(a[L]..a[R]\)的最大公因数. 输入格式 第一行两个整数\(n,m\). 第二行n个整数表示\(a[1]..a[n]\). 以下\(m\)行,每行\(2\)个整数表示询问区间的左右端点. 保证输入数据合法. 输出格式 共m行,每行表示一个询问的答案. 输入输出样例 输入 #1 5 3 4 12 3 6 7 1 3 2 3 5 5 输出 #1 1 3 7 说

UESTC - 1724 GCD区间求和

依然是神奇的欧拉函数 若GCD(n,i)=k 则GCD(n/k,i/k)=1, 令i/k=x,有GCD(n/k,x)=1, →k*GCD(n/k,x)=1中x的个数 = GCD(n,i)=k的和 范围就是求n的所有因子k #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+11; typedef unsigned long long ll; ll phi[maxn]; void euler(int n){ for(