“景驰科技杯”2018年华南理工大学程序设计竞赛 H 对称与反对称

原创 2018年04月17日 15:48:22

题目:
给出一个N*N的方阵A。构造方阵B,C:
使得A = B + C.其中 B为对称矩阵,C为反对称矩阵。
对于方阵S中的任意元素,若(S)ij = (S)ji,则称S为对称矩阵
对于方阵T中的任意元素,若(T)ij = -(T)ji,则称T为反对称矩阵
注意,所有运算在模M意义下
Input:
输入包含多组数据,处理到文件结束
每组数据,第一行包含两个正整数N,M(1 <= N <= 1000, 1 <= M <= 1000,000,001)分别表示方阵大小与模数,其中M必定为奇数。
接下来的N行,每行有N个非负整数,表示方阵A(0<=Aij<=1000,000,000)。
Output:
对于每组数据,将反对称矩阵CN行中输出;
若不存在解,则输出”Impossible”;
若存在多解,则输出任意解。
Sample Input:
2 19260817
0 1
1 0
Sample Output:
0 0
0 0
题目链接
矩阵主对角线不用考虑,先设A为:

[0C1C20]

设B为:
[0xx0]

设C为:
[0yy0]

则可得公式:
(x+y)%m=C1(xy)%m=C2

化简可得
y=((C1C2)÷2)%m

这里就得到了反对称矩阵C和输入矩阵A的关系式。
但是这个求解方程式中存在除法和取模的计算,这就需要用逆元来计算了。一篇解释逆元挺清楚的博文——>逆元(其实我理解的逆元就是在模关系下的倒数)。
求逆元又需要用到拓展欧几里得算法:

扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d
——百度百科

拓展欧几里得算法模板:

// 返回值为d(=gcd(a, b)),和ax+by=d中的x,y
long long extendgcd(long long a, long long b, long long &x, long long &y) {
    if (a == 0 && b == 0) {
        return -1;
    }
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    long long d = extendgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

求逆元模板:

// 返回值为a关于mod的逆元
long long inverse(long long a, long long mod) {
    long long x, y;
    long long d = extendgcd(a, mod, x, y);
    if (d == 1) {
        return (x % mod + mod) % mod;
    }
    else {
        return -1;
    }
}

输出中每行行尾无多余空格。
AC代码:

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3+5;
const double eps = 1e-5;
const double e = 2.718281828459;

int n;
ll m;
ll A[maxn][maxn];
ll C[maxn][maxn];

ll extendgcd(ll a, ll b, ll &x, ll &y) {
    if (a == 0 && b == 0) {
        return -1;
    }
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll d = extendgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

ll inverse(ll a, ll mod) {
    ll x, y;
    ll d = extendgcd(a, mod, x, y);
    if (d == 1) {
        return (x % mod + mod) % mod;
    }
    else {
        return -1;
    }
}

void antisymmetric_matrix() {
    ll inv = inverse(2, m);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (i < j) {
                C[i][j] = (A[i][j] - A[j][i]) * inv % m;
                C[j][i] = -C[i][j];
                while (C[i][j] < 0) {
                    C[i][j] += m;
                }
                while (C[j][i] < 0) {
                    C[j][i] += m;
                }
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    while (cin >> n >> m) {
        mem(A, 0);
        mem(C, 0);
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                cin >> A[i][j];
            }
        }
        antisymmetric_matrix();
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= n; ++j) {
                cout << C[i][j];
                if (j != n) {
                    cout << " ";
                }
            }
            cout << endl;
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tony5t4rk/article/details/79975955

对称与反对称 (“景驰科技杯”2018年华南理工大学程序设计竞赛)(逆元)

链接:https://www.nowcoder.com/acm/contest/94/H来源:牛客网题目描述给出一个N*N的方阵A。构造方阵B,C: 使得A = B + C.其中 B为对称矩阵,C为反...
  • dsaghjkye
  • dsaghjkye
  • 2018-04-09 18:29:10
  • 81

牛客网-“景驰科技杯”2018年华南理工大学程序设计竞赛

题目链接:传送门B-一级棒 //树的路径压缩题意:给出一个n,表示有n个节点0~n,0为根结点,随后给出n-1个数表示第i个节点连接的父节点再给出一个q,随后q次操作:R u v 表示节点u~v之间的...
  • weixin_41156591
  • weixin_41156591
  • 2018-04-11 20:51:41
  • 64

2018年东北农业大学春季校赛-L: wyh的天鹅(平衡树)

链接:https://www.nowcoder.com/acm/contest/93/L时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288K 64bit...
  • Mitsuha_
  • Mitsuha_
  • 2018-04-08 13:17:55
  • 30

景驰

题目: 在一个风雨交加的夜晚,来自异世界的不愿透露姓名的TMK同学获得了两种超强药水A、B。根据说明书,TMK知道了这两种药水的作用:     (1)药水A能使人的生命值提高,每饮用1个单位能使他生命...
  • zi_mingyue
  • zi_mingyue
  • 2018-03-31 14:55:57
  • 12

小马哥的超级盐水 (牛客网景驰科技杯)

链接:https://www.nowcoder.com/acm/contest/94/K来源:牛客网题意:给n杯盐水,每一杯水有a单位盐,b单位水。给你一个x和y,问有多少种方法能配成x比y的盐水。因...
  • qq_37632935
  • qq_37632935
  • 2018-04-08 17:23:40
  • 103

华南理工大学第二届“超级码力”程序设计竞赛暨广东省高校邀请赛

AC:2/12
  • u013292846
  • u013292846
  • 2014-04-26 21:19:22
  • 1116

“景驰科技杯”2018年华南理工大学程序设计竞赛 H 对称与反对称(逆元)

链接:https://www.nowcoder.com/acm/contest/94/H 来源:牛客网 题目描述 给出一个N*N的方阵A。构造方阵B,C: 使得A = B + C.其中 B为...
  • zhao5502169
  • zhao5502169
  • 2018-04-07 21:31:30
  • 34

以退为进还是被逼无奈?创始人王劲离职后,景驰科技该何去何从?

【数据猿导读】对于王劲的离职,业内有诸多猜测:有人说,因为百度的诉讼,让不到一周岁的景驰科技被推到了风口浪尖,董事会一气之下把王劲赶了出来;也有人说,王劲是以退为进,百度此举是针对王劲,而并非景驰科技...
  • YMPzUELX3AIAp7Q
  • YMPzUELX3AIAp7Q
  • 2018-03-02 00:00:00
  • 72

“景驰科技杯”2018年华南理工大学程序设计竞赛-A:欧洲爆破(期望+状压DP)

链接:https://www.nowcoder.com/acm/contest/94/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
  • Mitsuha_
  • Mitsuha_
  • 2018-04-13 10:40:33
  • 56

“景驰科技杯”2018年华南理工大学程序设计竞赛 H 对称与反对称(对称矩阵的性质)

描述 给出一个N*N的方阵A。构造方阵B,C: 使得A = B + C.其中 B为对称矩阵,C为反对称矩阵。 对于方阵S中的任意元素,若(S)ij = (S)ji,则称S为对称矩阵 对于...
  • riba2534
  • riba2534
  • 2018-04-09 19:19:52
  • 43
收藏助手
不良信息举报
您举报文章:“景驰科技杯”2018年华南理工大学程序设计竞赛 H 对称与反对称
举报原因:
原因补充:

(最多只允许输入30个字)