【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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM