1 条题解
-
0
代码思路 从标准输入不断读取整数 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
- 上传者