洛谷—— P2117 小Z的矩陣
阿新 • • 發佈:2017-11-23
發現 左右 clas ora www. stdout register 上一個 規模
輸出樣例#1: 復制
https://www.luogu.org/problemnew/show/2117
題目描述
小Z最近迷上了矩陣,他定義了一個對於一種特殊矩陣的特征函數G。對於N*N的矩陣A,A的所有元素均為0或1,則G(A)等於所有A[i][j]*A[j][i]的和對2取余之後的結果。舉一個例子:
對於上圖這個3*3矩陣A,G(A)=(1*1+1*0+1*1+0*1+1*1+1*0+1*1+ 0*1+0*0) mod 2=0
當然詢問一個矩陣的G值實在是太簡單了。小Z在給出一個N*N矩陣的同時將給你Q個操作,操作描述如下:
操作1:形如一個整數1和一個整數x,表示將第x行的元素全部“翻轉”。
操作2:形如一個整數2和一個整數x,表示將第x列的元素全部“翻轉”。
操作3:形如一個整數3,表示詢問當前矩陣的特征值G。
“翻轉”的定義為將1變成0,將0變成1。
輸入輸出格式
輸入格式:
第1行:兩個正整數N,Q。 N表示矩陣的行數(列數),Q表示詢問的個數。
接下來N行:一個N*N的矩陣A,0<=A[i][j]<=1。
接下來Q行:Q個操作。
輸出格式:
一行若幹個數,中間沒有空格,分別表示每個操作的結果(操作1和操作2不需要輸出)。
輸入輸出樣例
輸入樣例#1: 復制3 12 1 1 1 0 1 1 1 0 0 3 2 3 3 2 2 2 2 1 3 3 3 1 2 2 1 1 1 3
01001
說明
【數據規模】
30% N<=100, Q<=10^5
100% N<=1,000, Q <=5*10^5
以對角線為界,左右的乗起來加一遍,可以發現%2的結果都是0
更改時因為一定會有對角線上一個點更新,所以每次在0 1 之間變換就好了
1 #include <cstdio> 2 3 inline void read(int &x) 4 { 5 x=0; register char ch=getchar(); 6 for(; ch>‘9‘||ch<‘0‘; ) ch=getchar(); 7 for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘; 8 } 9 10 int n,q,ans; 11 12 int Presist() 13 { 14 // freopen("out.txt","w",stdout); 15 16 read(n),read(q); 17 for(int x,i=1; i<=n; ++i) 18 for(int j=1; j<=n; ++j) 19 { 20 read(x); 21 if(i==j&&x) ans=!ans; 22 } 23 for(int opt,x; q--; ) 24 { 25 read(opt); 26 if(opt==3) printf("%d",ans); 27 else read(x),ans=!ans; 28 } 29 return 0; 30 } 31 32 int Aptal=Presist(); 33 int main(int argc,char**argv){;}
洛谷—— P2117 小Z的矩陣