HDU 6313 Hack It 構造,數論
阿新 • • 發佈:2018-11-02
題意:要求構造一個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; }