QOJ.ac

QOJ

Time Limit: 60.0 s Memory Limit: 256 MB Total points: 100

#17522. 寻找倍数

Statistics

给你一个由数字组成的序列 $a_0 a_1 \cdots a_{N-1}$ 和一个质数 $Q$。对于满足 $a_i \ne 0$ 的每个 $i \le j$,子序列 $a_i a_{i+1} \cdots a_j$ 可以被视作一个正整数的十进制表示。不考虑含有前导零的子序列。你的任务是统计满足其对应子序列是 $Q$ 的倍数的数对 $(i, j)$ 的数量。

输入格式

输入最多包含 50 组数据。每组数据由一行包含四个空格隔开的整数 $N, S, W$ 和 $Q$ 表示,其中 $1 \le N \le 10^5$,$1 \le S \le 10^9$,$1 \le W \le 10^9$,且 $Q$ 是一个小于 $10^8$ 的质数。长度为 $N$ 的序列 $a_0 \cdots a_{N-1}$ 由以下代码生成,其中 $a_i$ 写作 a[i]

int g = S;
for(int i=0; i<N; i++) {
    a[i] = (g/7) % 10;
    if( g%2 == 0 ) { g = (g/2); }
    else { g = (g/2) ^ W; }
}

注意:运算符 /%^ 分别表示整除、取模和按位异或。上述代码旨在作为一个随机数生成器。本题的预期解法不依赖于序列的具体生成方式。

输入结束由一行包含四个由空格隔开的零(0 0 0 0)表示。

输出格式

对于每组数据,在一行中输出答案。你可以假设答案小于 $2^{30}$。

样例

输入样例 1

3 32 64 7
4 35 89 5
5 555 442 3
5 777 465 11
100000 666 701622763 65537
0 0 0 0

输出样例 1

2
4
6
3
68530

说明

在第一个数据集中,生成的序列为 421。我们可以找到两个 $Q = 7$ 的倍数,即 4221

在第二个数据集中,生成的序列为 5052,其中我们可以找到 5505055 作为 $Q = 5$ 的倍数。请注意,我们不统计 005,因为它们不是正整数的有效表示。同时请注意,我们统计了两次 5,因为它在不同的位置出现了两次。

在第三个和第四个数据集中,生成的序列分别为 9507312221

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.