Newcoder 142 D.Another Distinct Values(构造)

186 篇文章 0 订阅

Description

1,0,1 − 1 , 0 , 1 构造一个 n×n n × n 矩阵,使得行和,列和这 2n 2 n 个数字不同

Input

第一行一整数 T T 表示用例组数,每组用例输入一整数n(1T,n200)

Output

如果无解则输出 impossible i m p o s s i b l e ,否则输出 possible p o s s i b l e 以及一种方案

Sample Input

2
1
2

Sample Output

impossible
possible
1 0
1 -1

Solution

行列和范围为 [n,n] [ − n , n ] 2n+1 2 n + 1 种取值,那么行列和若合法则至少有 n n 个非负,假设合法方案的行列和分别为r1,...,rn,c1,...,cn,通过对行列的排序显然可以使得 r1,...,rk0,c1,...,cnk0 r 1 , . . . , r k ≥ 0 , c 1 , . . . , c n − k ≥ 0 ,考虑两个式子

i=1n|ri|+i=1n|ci|i=nn|i|n=n2 ∑ i = 1 n | r i | + ∑ i = 1 n | c i | ≥ ∑ i = − n n | i | − n = n 2

i=1n|ri|+i=1n|ci|===i=1krii=k+1nri+i=1nkci+i=nk+1nciikaiji>kaij+jnkaiji>nkaij2i=1kj=1nkaij2i=k+1nj=nk+1naij4k(nk) ∑ i = 1 n | r i | + ∑ i = 1 n | c i | = ∑ i = 1 k r i − ∑ i = k + 1 n r i + ∑ i = 1 n − k c i + ∑ i = n − k + 1 n c i = ∑ i ≤ k a i j − ∑ i > k a i j + ∑ j ≤ n − k a i j − ∑ i > n − k a i j = 2 ∑ i = 1 k ∑ j = 1 n − k a i j − 2 ∑ i = k + 1 n ∑ j = n − k + 1 n a i j ≤ 4 k ( n − k )

两式比较有 n24k(nk) n 2 ≤ 4 k ( n − k ) ,也即 (n2k)20 ( n − 2 k ) 2 ≤ 0 ,该式成立当且仅当 n=2k n = 2 k ,故 n n 为奇数时无解,而当n为偶数时,可以将矩阵斜对角线上放置若干 n=2 n = 2 时的 22 2 ⋅ 2 方阵,其余的在斜对角线上面方的全部放 1 1 ,下方的全部放1

Code

#include<cstdio>
using namespace std;
int T,n;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        if(n%2==0)
        {
            printf("possible\n");
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                {
                    int a;
                    if(i+j<=n)a=1;
                    else if(i+j==n+1)
                    {
                        if(i&1)a=0;
                        else a=1;
                    }
                    else a=-1;
                    printf("%d%c",a,j==n?'\n':' ');
                }
        }
        else printf("impossible\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值