先令F(x,y)=concat(x,y)*concat(y,x)+x*y,假设y有k位,concat(x,y)=x*+y题意是n块石头各自有魔法值,要求分成两种数量相同颜色不同的石头,找到0<=z<=3,使得任意颜色不同的石头的F(x,y)%3都不等于z
F(x,y)%3=(concat(x,y)*concat(y,x)+x*y)%3=((x*+y)*(y*+x)+x*y)%3=((x+y)*(y+x)+x*y)%3=(++3*x*y)%3=()%3
从化简的式子可以看出一个数的平方%3要么等于0,要么等于1,
所以x%3=0,(x*x)%3=0;x%3=1,(x*x)%3=1;x%3=2,(x*x)%3=1.
所以当0的个数大于等于一半的时候,我们可以构造出每个1都对应着一个不同颜色的0,剩下的一半的0再分别对应剩下的另一半的不同颜色的0,那么z不可能得到的是2
当1的个数大于等于一半的时候,我们可以构造出每一个0都对应着一个不同颜色的1,剩下的一半的1再分别对应剩下的另一半的不同颜色的1,那么z不可能得到的是0
AC代码:
#include <bits/stdc++.h> using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<LL> a(2), p(n); for (int i = 0; i < n; i++) { cin >> p[i]; p[i] = (p[i] * p[i]) % 3; a[p[i]]++; } int cnt; if (a[0] >= n / 2) { cnt = (a[0] - a[1]) / 2; cout << "2\n"; for (int i = 0; i < n; i++) { if (p[i] == 1 and a[1]) { cout << "1"; a[1]--; } else if (cnt) { cnt--; cout << "1"; } else { cout << "0"; } } cout << '\n'; } else if (a[1] >= n / 2) { cnt = (a[1] - a[0]) / 2; cout << "0\n"; for (int i = 0; i < n; i++) { if (p[i] == 0 and a[0]) { cout << "1"; a[0]--; } else if (cnt) { cout << "1"; cnt--; } else { cout << "0"; } } cout << '\n'; } else { cout << "-1\n"; } return 0; }
H. Hot Black Hot White(数学)
最新推荐文章于 2024-06-25 21:35:06 发布