#P14744. [Bulgarian2024夏季赛]gcdSquared

    ID: 13960 传统题 4000ms 256MiB 尝试: 2 已通过: 1 难度: 8 上传者: 标签>CF2500数学数论线段树数据结构分块

[Bulgarian2024夏季赛]gcdSquared

题目描述

给定一个长度为 n 的数列 v_1, v_2, ..., v_n。你需要回答如下询问:

给定整数 a, b, c, l, r,求:

gcd(f(v_l), f(v_{l+1}), ..., f(v_r))

其中:

f(x) = a * x^2 + b * x + c

请编写程序 gcdSquared 来回答这些询问。

实现要求

这是一个提交函数题

你提交的程序必须包含如下函数:

void init(int n, const int v[]);
long long getGCD(int a, int b, int c, int l, int r);
  • init 会在程序开始时且在任何询问之前被调用恰好一次,参数为数列长度 n 和数列内容 v
  • 随后会有 q 次对 getGCD 的调用,参数含义与题目描述一致;
  • 你需要提交文件 gcdSquared.cpp,其中实现上述两个函数;
  • 你可以自由添加辅助函数、结构体、变量等;
  • 提交文件中不能包含 main 函数
  • 提交文件开头必须包含头文件:
#include "gcdSquared.h"

数据范围

  • 1 <= n, q <= 200000
  • 1 <= l <= r <= n
  • 1 <= v_i <= 10^6
  • 0 <= a, b, c <= 10^6a + b + c > 0

子任务

子任务 分值 额外限制
1 5 n, q <= 10000
2 10 a = 0
3 15 l = 1, r = n
4 n, q <= 50000
5 25 n, q <= 100000
6 30

一项子任务只有在该子任务下所有测试全部通过时,才能获得该子任务的分数。

本地测试

题目提供了文件 gcdSquared.cppLgrader.cpp,你可以将它们与自己的程序一同编译进行本地测试。

Lgrader.cpp 的输入格式如下:

第一行输入 nq
第二行输入 n 个整数 v_1, v_2, ..., v_n
接下来 q 行,每行输入五个整数 a, b, c, l, r

原题还说明:你可以按需要自行修改所提供的本地测试文件。

样例

输入

5 1
1 2 3 4 5
1 2 3 4 5

输出

1

样例解释

f(v_4) = 1 * 4^2 + 2 * 4 + 3 = 27f(v_5) = 1 * 5^2 + 2 * 5 + 3 = 38,因此

gcd(27, 38) = 1