1153

題意:給一個素數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[i
I%n]都會相同,其他項都相同
又因為:每一位不能都相同,還要滿足整個01序列的字典序最小
再加上,a[11%n]是第一項,
所以,只要讓a[i
i%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;
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容