1. 程式人生 > 實用技巧 >【CCPC2020網路賽11】Convolution

【CCPC2020網路賽11】Convolution

原題:

題意:

定義一個函式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"
,&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 }
View Code