• 【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("
    ");
    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("
    ");
    32             }
    33         }
    34     }
    35     return 0;
    36 }
    View Code
  • 相关阅读:
    栈和队列
    链表
    map
    二叉平衡树旋转
    二叉排序树详情
    红黑树详情
    查并集
    动态规划
    位操作
    字典树
  • 原文地址:https://www.cnblogs.com/cdcq/p/13701117.html
Copyright © 2020-2023  润新知