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.

设 aa 是一个由 nn 个数组成的数组。该数组的元素编号从 11 到 nn;定义数组 eveneven 为 aa 中下标为偶数的元素组成的数组(即 eveni=a2ieven_i = a_{2i},其中 1≤2i≤n1 \leq 2i \leq n);定义数组 oddodd 为 aa 中下标为奇数的元素组成的数组(即 oddi=a2i−1odd_i = a_{2i-1},其中 1≤2i−1≤n1 \leq 2i-1 \leq n)。然后,我们如下定义数组的变换 F(a)F(a):

  • 若 n>1n > 1,则 F(a)=F(odd)+F(even)F(a) = F(odd) + F(even),其中运算 “++” 表示两个数组的拼接(连接);
  • 若 n=1n = 1,则 F(a)=aF(a) = a。

设 aa 是一个由 nn 个数 1,2,3,…,n1, 2, 3, \dots, n 组成的数组。令 bb 为对数组 aa 应用上述变换后得到的结果(即 b=F(a)b = F(a))。现给出 mm 个查询 (l,r,u,v)(l, r, u, v)。对于每个查询,你的任务是求出所有满足 l≤i≤rl \leq i \leq r 且 u≤bi≤vu \leq b_i \leq v 的 bib_i 的和。你应将每个查询结果对 modmod 取模后输出。

输入格式

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.

第一行包含三个整数 nn、mm、modmod(1 ≤ n ≤ 10181 \leq n \leq 10^{18},1 ≤ m ≤ 1051 \leq m \leq 10^5,1 ≤ mod ≤ 1091 \leq mod \leq 10^9)。接下来的 mm 行描述查询。每个查询由四个整数 ll、rr、uu、vv 定义(1 ≤ l ≤ r ≤ n1 \leq l \leq r \leq n,1 ≤ u ≤ v ≤ 10181 \leq u \leq v \leq 10^{18})。

在 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][4, 5] 内,因此其和显然为零。再考虑第二个查询:$ l = 2,\ r = 4,\ u = 1,\ v = 3 $。第 2 和第 3 个位置上有两个属于区间 [1,3][1, 3] 的数,它们的和为 5。

输入解题思路,AI测评打分。不知道怎么写?

首页