[agc016c]+/- Rectangle

本文介绍了一种构造特殊矩阵的方法,该矩阵每个h*w子矩阵的和为负数,但整个矩阵的和为正数。通过设定一个常数d,并利用矩阵的特性进行填充,实现了这一构造目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

对着样例构造乱搞过了QAQ

题意

构造一个n*m的矩阵,每个元素在-1e9~1e9间,每一个大小为h*w的子矩阵和是负数,而整个矩阵的和是正数。

构造

如果n是h的倍数且m是w的倍数,那么整个矩阵恰好分成若干个h*w的子矩阵,既然每个都是负数,和怎么可能是正数?
然后我们可以设一个d(d是常数比4000小就行然后尽量大比如2000),对于一个(ih,jw),我们填上-(hw-1)d-1,其余位置填上d。
这样每一个大小为h*w的子矩阵和一定是-1。
而因为有多余行列,只要有多余的一行或一列就能把这些-1拯救回来,整个矩阵和为正数。

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=500+10;
int a[maxn][maxn];
int i,j,k,l,t,n,m,d,h,w;
int main(){
    scanf("%d%d%d%d",&n,&m,&h,&w);
    d=2000;
    fo(i,1,n)
        fo(j,1,m)
            a[i][j]=d;
    fo(i,1,n/h)
        fo(j,1,m/w)
            a[h*i][w*j]=-(h*w-1)*d-1;
    t=0;
    fo(i,1,n)
        fo(j,1,m)
            t+=a[i][j];
    if (t<=0){
        printf("No\n");
        return 0;
    }
    printf("Yes\n");
    fo(i,1,n){
        fo(j,1,m) printf("%d%c",a[i][j],j==m?'\n':' ');
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值