题解:P12706 并非呃呃
fish_love_cat · · 题解
怎么秒了 /jy
容易想到均摊贡献。
发现一行大概要放
考虑对序列分块,一个块里面放一个。
假设块长为
于是想到如下构造:
将
对于每一大组的每个第一小组,使其选择的点全部一致。
然后对于第
尝试说明这样的构造是对的。
显然
若
若
若
这个式子可以改写成:
那就和前面一致了。
所以现在只需要找到一个
注意到当
做完了。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
if(n==4){// 小数据手搓验证规律
cout<<"1100\n";
cout<<"1001\n";
cout<<"1010\n";
cout<<"0011\n";
}else if(n==10){
cout<<"1001001000\n";
cout<<"1000100100\n";
cout<<"1000010010\n";
cout<<"0101000100\n";
cout<<"0100100010\n";
cout<<"0100011000\n";
cout<<"0011000010\n";
cout<<"0010101000\n";
cout<<"0010010100\n";
cout<<"0000000001\n";
}else{
map<int,bool>mp[2405];
for(int i=1;i<=47;i++){
for(int j=1;j<=47;j++){
mp[(i-1)*47+j][i]=1;
for(int k=1,g=(i+j)%47+1;k<47;k++,g=(g+j)%47+1)
mp[(i-1)*47+j][k*47+g]=1;
}
}
for(int i=1;i<=n;i++,cout<<"\n")
for(int j=1;j<=n;j++)cout<<mp[i][j];
}
}