核心结论: 对于每一次询问 ,最终剩下的最少数量要么是 0,要么是 1

推导过程:

  1. 整体和的性质: 每一次操作,牛牛都会删去一段和为 的倍数的数。这意味着,无论删除了多少段,剩余数字的总和初始数字的总和在模 意义下是同余的。 设初始所有数的和为 ,剩余数的和为 。 因为删除部分的和 ,所以

  2. 能否全部删完(答案为 0 的情况): 如果初始总和 本身就是 的倍数(即 ),那么牛牛可以选择整个环作为一段(因为整个环的和是 的倍数),直接一次性全部删去。 此时剩余个数为 0。

  3. 能否只剩一个(答案为 1 的情况): 如果 不是 的倍数,那么最后肯定不能删成 0 个(因为 0 个数的和为 0,是 的倍数,这与同余性质矛盾)。那么最少能剩几个呢?

    题目保证了 (即 小于等于环中数字的总个数)。 环中的数字是连续整数 。在一个长度至少为 的连续整数序列中,必然包含模 的所有余数(0 到 各至少出现一次)。

    我们需要剩下的数的和 。 既然序列中包含了所有可能的余数,那么一定存在一个数字 ),使得

    操作策略: 我们保留这个数字 ,将环上除了 以外的所有其他数看作一段(在环上,去掉一个点,剩下的部分依然是连续的一段)。 这一段的和为 。 因为 ,所以 。 这意味着除了 以外的那一段的和是 的倍数,可以被一次性删去。

    因此,只要 不是 的倍数,我们总是可以通过一次操作删去除了某一个特定数字外的所有数,最终只剩下 1 个数。

代码实现

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;

    while (T--) {
        ll l, r;
        cin >> l >> r;
        int m;
        cin >> m;
        ll S = (l + r) * (r - l + 1) / 2;
        while (m--) {
            ll x;
            cin >> x;
            if (S % x == 0)
                cout << "0\n";
            else
                cout << "1\n";
        }
    }
}