B. Chris and Magic Square

网友投稿 712 2022-10-18

B. Chris and Magic Square

B. Chris and Magic Square

// Problem: B. Chris and Magic Square// Contest: Codeforces - Codeforces Round #369 (Div. 2)// URL: Memory Limit: 256 MB// Time Limit: 2000 ms// 2022-03-15 22:16:04// // Powered by CP Editor (namespace std;#define rep(i,l,r) for(int i=(l);i<=(r);i++)#define per(i,l,r) for(int i=(l);i>=(r);i--)#define ll long long#define mset(s,t) memset(s,t,sizeof(t))#define mcpy(s,t) memcpy(s,t,sizeof(t))#define fi first#define se second#define pb push_back#define all(x) (x).begin(),(x).end()#define SZ(x) ((int)(x).size())#define mp make_pairtypedef pair pii;typedef pair pll;typedef vector vi; typedef vector Vll; typedef vector > vpii;typedef vector > vpll; const ll mod = 1e9 + 7;//const ll mod = 998244353;const double pi = acos(-1.0);inline ll qmi (ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans = ans * a%mod; a = a * a %mod; b >>= 1; } return ans;}inline int read () { int x = 0, f = 0; char ch = getchar(); while (!isdigit(ch)) f |= (ch=='-'),ch= getchar(); while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return f?-x:x;}template void print(T x) { if (x < 0) putchar('-'), x = -x; if (x >= 10) print(x/10); putchar(x % 10 + '0');}inline ll sub (ll a, ll b) { return ((a - b ) %mod + mod) %mod;}inline ll add (ll a, ll b) { return (a + b) %mod;}inline ll inv (ll a) { return qmi(a, mod - 2);}#define int long longint n;ll a[1000][1000];void solve() { cin >> n; int x = -1, y = -1; for (int i = 1; i <= n; i ++) { for (int j = 1; j <= n; j ++) { cin >> a[i][j]; if(!a[i][j]) x = i, y = j; } } if (n == 1) { cout << 1 << endl; return; } ll sum = 0; for (int i = 1; i <= n; i ++) { if (x != i) { for (int j = 1; j <= n; j ++) { sum += a[i][j]; } break; } } for (int j = 1; j <= n; j ++) { if (x == j) { continue; } int e= 0; for (int i = 1; i <= n; i ++) { e += a[j][i]; } if (e != sum) { puts("-1"); return; } } for (int j = 1; j <= n; j ++) { if (y == j) continue; int e= 0; for (int i = 1; i <= n; i ++) { e += a[i][j]; } if (e != sum) { puts("-1"); return; } } if (x + y != n + 1) { int each = 0; for (int i = 1; i <= n; i ++) each += a[i][n - i + 1]; if (sum != each) { puts("-1"); return; } } if (x != y) { int each =0; for (int i = 1; i <= n; i ++) each += a[i][i]; if (each != sum) { puts("-1"); return; } } if (x + y == n + 1 && x == y) { ll r1 = 0, l1 = 0, cc = 0, cc2 = 0; for (int i = 1; i <= n; i ++) l1 += a[x][i]; for (int i = 1; i<= n; i ++) r1 += a[i][y]; for (int i = 1; i <= n; i ++) cc += a[i][n - i + 1]; for (int i = 1; i <= n; i ++) cc2 += a[i][i]; if (r1 == l1 && l1 == cc && cc == cc2 && sum > r1) { cout << sum - r1 << endl; } else puts("-1"); return; } (1, n), (2, n - 1) if (x + y == n +1) { ll r1 = 0, l1 = 0, cc = 0; for (int i = 1; i <= n; i ++) l1 += a[x][i]; for (int i = 1; i<= n; i ++) r1 += a[i][y]; for (int i = 1; i <= n; i ++) cc += a[i][n - i + 1]; if (r1 == l1 && l1 == cc && sum > r1) { cout << sum - r1 << endl; } else puts("-1"); } else if (x == y) { ll r1 = 0, l1 = 0, cc = 0; for (int i = 1; i <= n; i ++) l1 += a[x][i]; for (int i = 1; i<= n; i ++) r1 += a[i][y]; for (int i = 1; i <= n; i ++) cc += a[i][i]; if (r1 == l1 && l1 == cc && sum > r1) { cout << sum - r1 << endl; } else puts("-1"); } else { ll r1 = 0, l1 = 0; for (int i = 1; i <= n; i ++) l1 += a[x][i]; for (int i = 1; i<= n; i ++) r1 += a[i][y]; if (l1 != r1 || sum <= r1) { puts("-1"); return; } cout << sum - l1 << endl; }}signed main () { // ios::sync_with_stdio(0),cin.tie(0), cout.tie(0); int t; t =1; //cin >> t; while (t --) solve(); return 0;}

题意:在0的地方放一个数,使得每行每列以及对角线相等 模拟即可(写了好多行。好菜啊)

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Division
下一篇:gcd数论分块
相关文章

 发表评论

暂时没有评论,来抢沙发吧~