Problem Description
A bitstring, whose length is one less than a prime, might be magic. 1001 is one such string. In order to see the magic in the string let us append a non-bit x to it, regard the new thingy as a cyclic string, and make this square matrix of bits
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.
Sample Input
5
3
17
47
2
79
0
Sample Output
0110
01
0010111001110100
0000100001101010001101100100111010100111101111
Impossible
001001100001011010000001001111001110101010100011000011011111101001011110011011
题意:给一个素数n,求这样的字符串,长度为n-1,在尾部添加一个字符x,然后执行n-1次这样的操作:每k(1到n-1)个字符中提取一个字符,构成长度为n-1的新字符串。这样,就形成了n-1行的长度为n-1的字符串。其中的字符串要么是原来的字符串,要么是补字符串,也就是说,结构中只有两种字符串,字符不能全部相同。(字符只包含0和1)
思路:
每1个字符中提取后,新的字符串为:
a[1%n], a[2%n], a[3%n],…,a[(n-1)%n];
第2个字符中提取后,新的字符串为:
a[2%n], a[4%n], a[6%n],…,a[2(n-1)%n];
如果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[9%n]…==a[i *i % n]
代码如下:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO code application logic here
Scanner cin = new Scanner(System.in);
while (true) {
int n = cin.nextInt();
if (n == 0) break;
if (n == 2) {
System.out.println("Impossible");
} else {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) sb.append('1');
for (int i = 1; i < n; i++){
sb.setCharAt((int)((long)i * (long)i % n), '0');
}
String s = sb.substring(1);
System.out.println(s);
}
}
}
}