Codeforces 490D Chocolate(数论)

来源:互联网 发布:知音网络周刊 编辑:程序博客网 时间:2024/05/16 05:36

题目链接:Codeforces 490D Chocolate

两个种变换方式无疑是减掉一个因子3加上一个因子2和减掉一个因子2,所以从因子的角度出发,如果两组数存在不同的质因子肯定是不可以的。剩下的就是构造答案了。

#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn = 105;int Arr[2][2], fac[2][maxn], cnt[2][2];void divFact(int* a, int* b, int& c, int n) {while (n % 2 == 0) {b[0]++;n /= 2;}while (n % 3 == 0) {b[1]++;n /= 3;}int m = sqrt(n);for (int i = 5; i <= m; i++) {while (n % i == 0) {a[++c] = i;n /= i;}if (n < i)break;}if (n != 1)a[++c] = n;}void del (int idx, int d, int n) {while (n && Arr[idx][0] % d == 0) {Arr[idx][0] /= d;if (d == 3)Arr[idx][0] *= 2;n--;}while (n && Arr[idx][1] % d == 0) {Arr[idx][1] /= d;if (d == 3)Arr[idx][1] *= 2;n--;}}int solve () {if (fac[0][0] != fac[1][0])return -1;for (int i = 1; i <= fac[0][0]; i++) {if (fac[0][i] != fac[1][i])return -1;}int ret = 0, n;if (cnt[0][1] >= cnt[1][1]) {n = cnt[0][1] - cnt[1][1];cnt[0][0] += n;del(0, 3, n);} else {n = cnt[1][1] - cnt[0][1];cnt[1][0] += n;del(1, 3, n);}ret += n;n = cnt[0][0] - cnt[1][0];if (n >= 0) {ret += n;del(0, 2, n);} else {ret -= n;del(1, 2, -n);}return ret;}int main () {for (int i = 0; i < 2; i++) {fac[i][0] = 0;for (int j = 0; j < 2; j++) {scanf("%d", &Arr[i][j]);divFact(fac[i], cnt[i], fac[i][0], Arr[i][j]);}sort(fac[i] + 1, fac[i] + fac[i][0] + 1);}int ans = solve();if(ans >= 0) {printf("%d\n", ans);for (int i = 0; i < 2; i++)printf("%d %d\n", Arr[i][0], Arr[i][1]);} elseprintf("-1\n");return 0;}


0 0