Magic Bitstrings
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 51 Accepted Submission(s): 29
each bit 1001
every 2nd bit 0110
every 3rd bit 0110
every 4th bit 1001
This matrix has the same number of rows as the length of the original bitstring. The m-th row of the matrix has every m-th bit of the original string starting with the m-th bit. Because the enlarged thingy has prime length, the appended x never gets used.
If each row of the matrix is either the original bitstring or its complement, the original bitstring is magic.
Each line of input (except last) contains a prime number p ≤ 100000. The last line contains 0 and this line should not be processed. For each prime number from the input produce one line of output containing the lexicographically smallest, non-constant magic bitstring of length p-1, if such a string exists, otherwise output Impossible.
把矩陣列出來
a[1%n], a[2%n], a[3%n], ..., a[n-1] (1)
a[2%n], a[4%n], a[6%n], ..., a[2(n-1)%n] (2)
a[3%n], a[6%n], a[9%n], ..., a[3(n-1)%n] (3)
...
比較 (1), (2)
發現:
如果 a[1%n] != a[2%n],那麼 a[2%n] != a[4%n],那麼 a[1%n] == a[4%n];
如果 a[1%n] == a[2%n],那麼 a[2%n] == a[4%n],那麼 a[1%n] == a[4%n]。
所以 a[1%n] == a[4%n]
同樣的方法得到:
a[1%n] == a[9%n],
a[1%n] == a[16%n],
....
所有下標是 i 平方 mod n 都相等。
下標不是 i 平方 mod n 都相等。
爲了字典順序最小,並且避免整個數列都是同一個數(題目要求 non-constant),令 a[1%n] = a[4%n] = a[9%n] = ... = 0,其他數都是 1,這樣符合題意。
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
int main () {
long long p;
while ((std::cin >> p) && p) {
if (p == 2) {
std::cout << "Impossible\n";
continue;
}
std::vector <int> v (p, 1);
for (long long i=1; i<p; ++i) {
v [i * i % p] = 0;
}
std::copy (v.begin() + 1, v.end(), std::ostream_iterator <int> (std::cout));
std::cout << "\n";
}
return 0;
}