1. 程式人生 > >HDU 6313 Hack It 構造,數論

HDU 6313 Hack It 構造,數論

題意:要求構造一個n*n的01矩陣,滿足其任意的子矩形,其4個角都不全為1.
1<=n<=2000.並且矩陣中1的個數要>=85000.

令n=p^2. 任意兩個01序列相同的1數量不超過1.
構造:總共p塊.每塊有p行,每行分為p個區域.每個區域p列.
然後令每一個行中每一個區域都正好有一個1.
並且每塊中除了第一行以外,其餘同行中任意兩個1所在位置模p不同餘 (同一行1所在的列正好構成模p的完全剩餘系)'

例如n=25,p=5.
10000 10000 10000 10000 10000
10000 01000 00100 00010 00001 (0,1,2,3,4)
10000 00100 00001 01000 00010 (0,2,4,1,3)
..............................

證明這種構造是合法的.

令c1,c2為某一行含兩個1的兩個列.其區域分別為k1,k2
現在要證明這樣的行只有一個,若有兩行以上 則構成4個角為1的子矩形.
第i塊的第j行 (i,j) 確定一個row. 
i+j*k1 ≡ c1 (mod p).
i+j*k2 ≡ c2 (mod p)
j(k1-k2) ≡ c1-c2 (mod p)
p為素數 (i,j)的解唯一.這樣的行只有一個.

#include <bits/stdc++.h>
using namespace std;
const int N=3e3+5;
bool a[N][N]; 
int main(){
	int p=47;
	for(int i=0;i<p;i++)
		for(int j=0;j<p;j++)
			for(int k=0;k<p;k++)
				a[i*p+j][k*p+(i+k*j)%p]=1;
	puts("2000");
	for(int i=0;i<2000;i++)
	{
		for(int j=0;j<2000;j++)	
			printf("%d",a[i][j]);	
		printf("\n");
	}
	return 0;
}