1 条题解

  • 0
    @ 2025-7-1 18:38:25

    代码思路 从标准输入不断读取整数 p,直到读取到 0 为止。 对于每个非零的输入 p,进行以下处理: 如果 p 等于 2,直接输出 "Impossible",因为在这种情况下无法按照后续逻辑生成所需的序列。 否则,创建一个长度为 p 的 std::vector 容器 a,并初始化为所有元素都是 1。 接着通过一个循环,对于从 1 到 p - 1 的每个整数 i,计算 i * i % p,并将向量 a 中对应位置的元素设置为 0。 最后遍历向量 a,输出其中从索引 1 到 p - 1 的每个元素,得到最终的序列。 输入处理循环:while (std::cin >> p) 这个循环会不断读取标准输入的整数赋值给 p。只要输入不为 0,循环就会继续执行,这样可以处理多个输入值。

    特殊情况判断:当 p 等于 2 时,根据问题的要求输出 "Impossible"。这是因为当 p = 2 时,无法按照后续的逻辑生成满足条件的序列。

    向量初始化与修改:std::vector a(p, 1) 创建了一个长度为 p 的向量 a,并将所有元素初始化为 1。这意味着初始状态下,向量中的每个位置都被设置为 1。for (long long i = 1; i < p; i++) { a[i * i % p] = 0; } 这个循环遍历从 1 到 p - 1 的整数 i。对于每个 i,计算 i * i % p,这实际上是找到 i 的平方对 p 取模的结果。然后将向量 a 中对应这个位置的元素设置为 0。这样就标记了所有平方数模 p 的位置。

    输出结果:for (int i = 1; i < p; i++) { std::cout << a[i]; } 遍历向量 a,从索引 1 开始输出每个元素,从而得到最终的序列。如果 a 的索引从 0 开始,那么当 p = 2 时,可能会导致输出错误的结果,所以从索引 1 开始输出。输出的序列中,对应平方数模 p 的位置为 0,其余位置为 1。

    #include <iostream>
    #include <vector>
     
    int main() {
        long long p;
        while (std::cin >> p) {
            if (p == 0) break;
            if (p == 2) {
                std::cout << "Impossible" << std::endl;
            } else {
                std::vector<int> a(p, 1);
                for (long long i = 1; i < p; i++) {
                    a[i * i % p] = 0;
                }
                for (int i = 1; i < p; i++) {
                    std::cout << a[i];
                }
                std::cout << std::endl;
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1462
    时间
    1000ms
    内存
    64MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者