您的位置:首页 > 其它

codeforces 734F (数学)

2016-11-17 09:42 405 查看

题目链接:点击这里

题意:给出两个数组b,c,构造a数组满足条件.

首先需要知道一个推论:a AND b+a OR b=a+b,这个按位比较很显然是相等的. 然后把原式的bi和ci加起来就得到了:

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪b.1+c1=na1+∑ab2+c2=na2+∑a⋮bn+cn=nan+∑a

这么一个n元1次方程解出来也很容易,然后就是带入按位check, 按照ai在当前位的奇偶性讨论即可.

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <stack>
#define Clear(x,y) memset (x,y,sizeof(x))
#define Close() ios::sync_with_stdio(0)
#define Open() freopen ("more.in", "r", stdin)
#define fi first
#define se second
#define pii pair<int, int>
#define pli pair<long long, int>
#define pb push_back
#define mod 1000000007
template <class T>
inline bool scan (T &ret) {
char c;
int sgn;
if (c = getchar(), c == EOF) return 0; //EOF
while (c != '-' && (c < '0' || c > '9') ) c = getchar();
sgn = (c == '-') ? -1 : 1;
ret = (c == '-') ? 0 : (c - '0');
while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return 1;
}
using namespace std;
#define maxn 200005

long long b[maxn], c[maxn], f[maxn], a[maxn], ans[maxn];
int n;

int main () {
//Open ();
Close ();
cin >> n;
for (int i = 1; i <= n; i++) cin >> b[i];
long long sum = 0;
for (int i = 1; i <= n; i++) {
cin >> c[i];
f[i] = b[i]+c[i];
sum += f[i];
}
a[1] = (f[1]*2*n-sum);
if (a[1]%(1LL*2*n*n) != 0) {
cout << "-1" << endl;
return 0;
}
a[1] /= (1LL*2*n*n); ans[1] = a[1];
if (a[1] < 0) {
cout << -1 << endl;
return 0;
}
for (int i = 2; i <= n; i++) {
if ((f[i]-f[1])%n != 0) {
cout << -1 << endl;
return 0;
}
a[i] = a[1]+(f[i]-f[1])/n;
if (a[i] < 0) {
cout << -1 << endl;
return 0;
}
ans[i] = a[i];
}
for (int bit = 1; bit <= 33; bit++) {
int num = 0;
for (int i = 1; i <= n; i++) {
num += (a[i]&1);
}
for (int i = 1; i <= n; i++) {
if (a[i]&1) b[i] -= num, c[i] -= n;
else c[i] -= num;
if ((b[i]&1) || (c[i]&1)) {
cout << -1 << endl;
return 0;
}
b[i] >>= 1;
c[i] >>= 1;
}
for (int i = 1; i <= n; i++) a[i] >>= 1;
}
for (int i = 1; i <= n; i++) cout << ans[i] << " "; cout <<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: