Codeforces 490D Chocolate(数论)

题目链接: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]);
	} else
		printf("-1\n");
	return 0;
}
时间: 2024-11-03 21:53:50

Codeforces 490D Chocolate(数论)的相关文章

CodeForces 490D Chocolate

题意: 2块矩形巧克力  如果边长可以整除2  则可以从一半出掰开  吃掉一半  如果可以整除3  则可以从1/3处掰开  吃掉1/3  问  最少吃几次  能使得2块面积相同  输出最后时刻的边长 思路: 面积最多只有10^18  因此形成的面积的种类数最多几万种  我们可以利用面积来暴搜出所有状态  然后找面积相同时的最少步数 PS:数论的方法更好 代码: #include<cstdio> #include<iostream> #include<cstring> #

Codeforces 223APartial Sums 数论+组合数学

题意很简单,求不是那么好求的,k很大 要操作很多次,所以不可能直接来的,印象中解决操作比较多无非线段树 循环节 矩阵 组合数等等吧,这道题目 也就只能多画画什么 的了 就以第一个案例为主吧 , 3 1 2 3 k我们依据画的次数来自己定好了 下面的每个数表示这个位置的 数由最初的 数组num[]中多少个数加起来得到的 当k为0的时候呢,就是 1 1 1 k为1的时候呢 1 2 3 k为2的时候呢 1 3 6 那么k为3的时候 1 4 10 这里看一下 从数组下标0开始,那么其实就是 C(i +

codeforces 735D Taxes(数论)

Maximal GCD 题目链接:http://codeforces.com/problemset/problem/735/D --每天在线,欢迎留言谈论. 题目大意: 给你一个n(2≤n≤2e9) 代表一个人的收入. 他需要交税,规则:交税金额为n的最大公约数(本身不算) 他想通过把钱分成几份,然后分别交税,达到交税最少. 知识点: 哥德巴赫猜想:①如果一个数为偶数,那么可以拆成两个质数相加 ②如果一个奇数 (n-2)为质数那么他也可以拆成两个质数相加(2+(n-2)) ③其他的奇数 可以拆成

codeforces 617B Chocolate

题意: 在给定01串中,问能分割成多少个子串?每个子串只有一个1. dp 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8 #include<vector> 9 #include<cstr

CodeForces 598E Chocolate Bar

区间DP预处理. dp[i][j][k]表示大小为i*j的巧克力块,切出k块的最小代价. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const long long INF=9999999999999999; const int maxn=60; long long dp[maxn][maxn][maxn]; int n

Maximal GCD CodeForces - 803C (数论+思维优化)

C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given positive integer number n. You should create such strictly increasing sequence of k positive numbers a1,?a2,?...

Codeforces 1110C (思维+数论)

题面 传送门 分析 这种数据范围比较大的题最好的方法是先暴力打表找规律 通过打表,可以发现规律如下: 定义\(x=2^{log_2a+1}\) (注意,cf官方题解这里写错了,官方题解中定义\(x=2^{log_2a}\)是有问题的 (1) 若\(a \neq 2^x-1\) ? 则当\(b=(2^x-1)\) xor a时a xor b=b=\(2^x-1\) ,a and b=0 ? gcd(a xor b,a and b)=\(2^x-1\)有最大值 ? (异或的性质,若a xor c =

CodeForces 396A 数论 组合数学

题目:http://codeforces.com/contest/396/problem/A 好久没做数论的东西了,一个获取素数的预处理跟素因子分解写错了,哭瞎了,呵呵, 首先ai最大值为10^9,n为500,最坏的情况 m最大值为500个10^9相乘,肯定不能获取m了,首选每一个ai肯定是m的一个因子,然后能分解就把ai给分解素因子,这样全部的ai都分解了  就能得到m的 所有素因子 以及 所有素因子的个数,题目求的 是n个因子的 不同序列的个数,所以每次 只能选出n个因子,这n个因子由素因子

codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)

In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 = 1; F2 = 1; Fn = Fn - 1 + Fn - 2 (n > 2). DZY loves Fibonacci numbers very much. Today DZY gives you an array consisting of n integers: a1, a2, ...,