cdcq

梦幻小鱼干

导航

【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

 

posted on 2020-09-20 17:35  cdcq  阅读(1182)  评论(0编辑  收藏  举报