【CCPC2020網路賽11】Convolution
阿新 • • 發佈:2020-09-20
原題:
題意:
定義一個函式C,引數為兩個矩陣A和K,其中A是n*n矩陣,K是3*3矩陣,K是一個分數矩陣,K_i,j=K'_i,j/∑K'_i,j,其中K‘是輸入的整數矩陣,這意味著∑K_i,j=1
然後C的值由圖裡的公式算
現在問你對於同一個K,拿C套娃無窮次得到的矩陣
性質:
對於A右下角那個數,根據公式可以看出,超出A的部分直接被丟棄了,所以如果K不是隻有左上角不為0(即如果左上角小於1)的話,那麼套個無窮次右下角一定會變成0
如果右下角變成0了,那麼對於右下角左邊的那個數,再套若干次同理也會變成0(理解這個過程需要理解一點極限的思想,即極限不是具體的數,而是動態的趨勢)
同理對於右下角的上邊,也會變成0
那麼現在右下角的左上角的右下方3個數也全變成0了,它也會變成0
由此可以歸納地證明整個矩陣都會變成0
結論:
如果K不滿足只有左上角不為0的條件,那麼結果就是全0,否則結果是A原矩陣
程式碼:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n,a[1100][1100],b[10][10]; 5 int main(){ 6 int T; cin>>T; 7 for(int t=1;t<=T;++t){ 8 scanf("%d"View Code,&n); 9 for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) 10 scanf("%d",&a[i][j]); 11 int cnt=0; 12 for(int i=1;i<=3;++i)for(int j=1;j<=3;++j){ 13 scanf("%d",&b[i][j]); 14 if(b[i][j]) ++cnt; 15 } 16 if(cnt==1&& b[1][1]){ 17 for(int i=1;i<=n;++i){ 18 for(int j=1;j<=n;++j){ 19 printf("%d",a[i][j]); 20 if(j!=n) printf(" "); 21 } 22 printf("\n"); 23 } 24 } 25 else{ 26 for(int i=1;i<=n;++i){ 27 for(int j=1;j<=n;++j){ 28 printf("0"); 29 if(j!=n) printf(" "); 30 } 31 printf("\n"); 32 } 33 } 34 } 35 return 0; 36 }