題意:給一個素數n,求這樣的字符串,長度為n-1,在尾部添加一個字符x,然后執行n-1次這樣的操作:每k(1到n-1)個字符中提取一個字符,構成長度為n-1的新字符串。這樣,就形成了n-1行的長度為n-1的字符串。其中的字符串要么是原來的字符串,要么是補字符串,也就是說,結構中只有兩種字符串,字符不能全部相同。(字符只包含0和1)
作者:kgduu
來源:CSDN
原文:https://blog.csdn.net/xiexingshishu/article/details/45771203
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
思路:
第一部分:列式子
1.a[1%n] a[2%n]......a[n-1%n]
2.a[2%n] a[4%n]......a[2(n-1)%n]
3.a[3%n] a[6%n]........
4...
..
..
n-1: a[(n-1)%n] a[2(n-1)%n]......a[(n-1)*(n-1)%n]
第二部分:結合兩種情況做差
①:1-2每一個都對應相同
②:1-2每一個都對應相反
由①得到:(一)
a[1%n]=a[2%n]
a[2%n]=a[4%n]
...
...
a[(n-1)%N]=a[2(n-1)%n]
由②得到:(二)
a[1%n]!=a[2%n]
a[2%n]!=a[4%n]
...
...
a[(n-1)%n]!=a[(n-1)%n]
將一、二合并:
(三)
a[1%n]=a[4%n]
a[2%n]=a[6%n]
...
第三部分:得到結論
觀察得到:a[iI%n]都會相同,其他項都相同
又因為:每一位不能都相同,還要滿足整個01序列的字典序最小
再加上,a[11%n]是第一項,
所以,只要讓a[ii%n]=0,其他=1,即可
#include<bits/stdc++.h>
#define ll long long
#define maxsize 1000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int p,a[maxsize];
int main()
{
while(cin>>p&&p)
{
if(p<3)
{
printf("Impossible\n");
continue;
}
mem(a,0);
for(ll i=1;i<p;++i)
{
a[(i*i)%p]=1;
}
for(ll i=1;i<=p-1;++i)
printf("%d",!a[i]);
cout<<endl;
}
return 0;
}