【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 }