CF117D.Not Quick Transformation
省选/NOI-
通过率:0%
时间限制:6.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Let a be an array consisting of n numbers. The array's elements are numbered from 1 to n, even is an array consisting of the numerals whose numbers are even in a (even__i = a_2_i, 1 ≤ 2_i_ ≤ n), odd is an array consisting of the numberals whose numbers are odd in а (odd__i = a_2_i - 1, 1 ≤ 2_i_ - 1 ≤ n). Then let's define the transformation of array F(a) in the following manner:
- if n > 1, F(a) = F(odd) + F(even), where operation " + " stands for the arrays' concatenation (joining together)
- if n = 1, F(a) = a
Let a be an array consisting of n numbers 1, 2, 3, ..., n. Then b is the result of applying the transformation to the array a (so b = F(a)). You are given m queries (l, r, u, v). Your task is to find for each query the sum of numbers b__i, such that l ≤ i ≤ r and u ≤ b__i ≤ v. You should print the query results modulo mod.
设 a 是一个由 n 个数组成的数组。该数组的元素编号从 1 到 n;定义数组 even 为 a 中下标为偶数的元素组成的数组(即 eveni=a2i,其中 1≤2i≤n);定义数组 odd 为 a 中下标为奇数的元素组成的数组(即 oddi=a2i−1,其中 1≤2i−1≤n)。然后,我们如下定义数组的变换 F(a):
- 若 n>1,则 F(a)=F(odd)+F(even),其中运算 “+” 表示两个数组的拼接(连接);
- 若 n=1,则 F(a)=a。
设 a 是一个由 n 个数 1,2,3,…,n 组成的数组。令 b 为对数组 a 应用上述变换后得到的结果(即 b=F(a))。现给出 m 个查询 (l,r,u,v)。对于每个查询,你的任务是求出所有满足 l≤i≤r 且 u≤bi≤v 的 bi 的和。你应将每个查询结果对 mod 取模后输出。
输入格式
The first line contains three integers n, m, mod (1 ≤ n ≤ 1018, 1 ≤ m ≤ 105, 1 ≤ mod ≤ 109). Next m lines describe the queries. Each query is defined by four integers l, r, u, v (1 ≤ l ≤ r ≤ n, 1 ≤ u ≤ v ≤ 1018).
Please do not use the %lld specificator to read or write 64-bit integers in C++. Use %I64d specificator.
第一行包含三个整数 n、m、mod(1 ≤ n ≤ 1018,1 ≤ m ≤ 105,1 ≤ mod ≤ 109)。接下来的 m 行描述查询。每个查询由四个整数 l、r、u、v 定义(1 ≤ l ≤ r ≤ n,1 ≤ u ≤ v ≤ 1018)。
在 C++ 中读取或写入 64 位整数时,请勿使用 %lld 格式说明符,而应使用 %I64d 格式说明符。
输出格式
Print m lines each containing an integer — remainder modulo mod of the query result.
输出 m 行,每行包含一个整数——查询结果对 mod 取模后的余数。
输入输出样例
输入#1
4 5 10000 2 3 4 5 2 4 1 3 1 2 2 4 2 3 3 5 1 3 3 4
输出#1
0 5 3 3 3
输入#2
2 5 10000 1 2 2 2 1 1 4 5 1 1 2 5 1 1 1 3 1 2 5 5
输出#2
2 0 0 1 0
说明/提示
Let's consider the first example. First let's construct an array b = F(a) = F([1, 2, 3, 4]).
- Step 1. F([1, 2, 3, 4]) = F([1, 3]) + F([2, 4])
- Step 2. F([1, 3]) = F([1]) + F([3]) = [1] + [3] = [1, 3]
- Step 3. F([2, 4]) = F([2]) + F([4]) = [2] + [4] = [2, 4]
- Step 4. b = F([1, 2, 3, 4]) = F([1, 3]) + F([2, 4]) = [1, 3] + [2, 4] = [1, 3, 2, 4]
Thus b = [1, 3, 2, 4]. Let's consider the first query l = 2, r = 3, u = 4, v = 5. The second and third positions in the array b do not have numbers in the range [4, 5], so the sum obviously equals zero. Let's consider the second query l = 2, r = 4, u = 1, v = 3. The second and third positions have two numbers that belong to the range [1, 3], their sum equals 5.
我们来考虑第一个例子。首先构造数组 $ b = F(a) = F([1, 2, 3, 4]) $。
- 步骤 1:$ F([1, 2, 3, 4]) = F([1, 3]) + F([2, 4]) $
- 步骤 2:$ F([1, 3]) = F([1]) + F([3]) = [1] + [3] = [1, 3] $
- 步骤 3:$ F([2, 4]) = F([2]) + F([4]) = [2] + [4] = [2, 4] $
- 步骤 4:$ b = F([1, 2, 3, 4]) = F([1, 3]) + F([2, 4]) = [1, 3] + [2, 4] = [1, 3, 2, 4] $
因此,$ b = [1, 3, 2, 4] 。我们来考虑第一个查询: l = 2,\ r = 3,\ u = 4,\ v = 5 $。数组 $ b $ 中第 2 和第 3 个位置上的数均不在区间 [4,5] 内,因此其和显然为零。再考虑第二个查询:$ l = 2,\ r = 4,\ u = 1,\ v = 3 $。第 2 和第 3 个位置上有两个属于区间 [1,3] 的数,它们的和为 5。
输入解题思路,AI测评打分。不知道怎么写?