codeforces 734F (数学)

来源:互联网 发布:网站权限数据库设计 编辑:程序博客网 时间:2024/05/17 22:59

题目链接:点击这里

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

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

b.1+c1=na1+ab2+c2=na2+abn+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 1000000007template <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 200005long 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;}
0 0
原创粉丝点击