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; }
相关文章推荐
- CodeForces 630 H. Benches(组合数学)
- Codeforces 807C Success Rate【二分+数学思维】
- Codeforces 626C Block Towers「贪心」「二分」「数学规律」
- CodeForces - 630J Divisibility (数学求最小公倍数)
- CodeForces - 630O Arrow (数学几何求点的坐标)
- Codeforces 758C Unfair Poll 【数学】【思维】
- CodeForces 598A:Tricky Sum【数学】
- codeforces 630G Challenge Pennants(组合数学)
- codeforces 347 c Alice and Bob(博弈 && 数学)
- CodeForces 610APasha and Stick(数学)
- codeforces 546D (数学 水)
- CodeForces - 762A k-th divisor (数学
- codeforces 24 Game(数学构造)
- Codeforces 851 C Five Dimensional Points(数学概念优化)
- Codeforces 300C Beautiful Numbers 【组合数学】
- 【数学思维】CodeForces - 233B Non-square Equation
- Codeforces-448【A数学函数ceil】【B思维】【D二分】
- CodeForces-687B Remainders Game(数学题)
- CodeForces - 659D Bicycle Race (数学几何&技巧转换)
- 【CodeForces 628B】 New Skateboard (数学水)