Codeforces Round #137 (Div. 2), problem: (C)

本文深入探讨了代码优化技巧及算法实现的核心原理,通过实例解析如何提高代码效率并解决实际问题。

大神代码直接看瞎了,收获好大。。。

C. Reducing Fractions
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

To confuse the opponents, the Galactic Empire represents fractions in an unusual format. The fractions are represented as two sets of integers. The product of numbers from the first set gives the fraction numerator, the product of numbers from the second set gives the fraction denominator. However, it turned out that the programs that work with fractions in this representations aren't complete, they lack supporting the operation of reducing fractions. Implement this operation and the Empire won't forget you.

Input

The first input line contains two space-separated integers nm (1 ≤ n, m ≤ 105) that show how many numbers the first set (the numerator) and the second set (the denominator) contain, correspondingly.

The second line contains n space-separated integers: a1, a2, ..., an (1 ≤ ai ≤ 107) — the numbers that are multiplied to produce the numerator.

The third line contains m space-separated integers: b1, b2, ..., bm (1 ≤ bi ≤ 107) — the numbers that are multiplied to produce the denominator.

Output

Print the answer to the problem in the form, similar to the form of the input data. The number of values in the sets you print nout, moutmust satisfy the inequality 1 ≤ nout, mout ≤ 105, and the actual values in the sets aout, i and bout, i must satisfy the inequality 1 ≤ aout, i, bout, i ≤ 107.

Separate the values in the lines by spaces. The printed fraction must be reduced, that is, there mustn't be such integer x (x > 1), that the numerator and the denominator of the printed fraction are divisible by x. If there are several matching answers, print any of them.

Sample test(s)
input
3 2
100 5 2
50 10
output
2 3
2 1
1 1 1
input
4 3
2 5 10 20
100 1 3
output
1 1
20
3
Note

In the first test sample the numerator equals 1000, the denominator equals 500. If we reduce fraction 1000/500 by the greatest common divisor of the numerator and the denominator (by 500), we obtain fraction 2/1.

In the second test sample the numerator equals 2000, the denominator equals 300. If we reduce fraction 2000/300 by the greatest common divisor of the numerator and the denominator (by 100), we obtain fraction 20/3.


By Shik, contest: Codeforces Round #137 (Div. 2), problem: (C) Reducing Fractions, Accepted#

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
#define S 10000010
#define SZ(x) ((int)(x).size())
#define FOR(it,c) for ( __typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++ )
using namespace std;
int p[S];
void predo() {
	for ( int i=2; i*i<S; i++ ) if ( !p[i] ) for ( int j=i*i; j<S; j+=i ) p[j]=i;
	for ( int i=2; i<S; i++ ) if ( !p[i] ) p[i]=i;
}
void shik( int n, int s[], int t[] ) {
	for ( int i=0; i<n; i++ ) for ( int j=s[i]; j>1; j/=p[j] ) t[p[j]]++;
}
void meow( int n, int s[], int t[] ) {
	for ( int i=0; i<n; i++ ) {
		int x=1;
		for ( int j=s[i]; j>1; j/=p[j] ) {
			if ( t[p[j]]>0 ) t[p[j]]--;
			else x*=p[j];
		}
		printf("%d%c",x,i==n-1?'\n':' ');
	}
}
int n,m,a[N],b[N],x[S],y[S];
int main()
{
	predo();
	scanf("%d%d",&n,&m);
	for ( int i=0; i<n; i++ ) scanf("%d",a+i);
	for ( int i=0; i<m; i++ ) scanf("%d",b+i);
	printf("%d %d\n",n,m);
	shik(n,a,x); shik(m,b,y);
	meow(n,a,y); meow(m,b,x);
	return 0;
}


### Codeforces Round 1021 (Div. 2) 解析 以下是关于 **Codeforces Round 1021 (Div. 2)** 的部分题目解析以及对应的解决方案。如果具体题目未完全覆盖,可以通过官方比赛页面或社区讨论进一步补充。 --- #### A. Problem Name 此题的核心在于简单的数学计算和逻辑推导。假设输入数据为 `n` 和一系列数值,则通过验证某些特定条件得出最终结论。 代码如下: ```cpp #include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; // 假设此处有具体的处理逻辑 bool flag = true; // 或者其他变量用于存储中间结果 if (flag) { cout << "YES" << endl; } else { cout << "NO" << endl; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while (t--) { solve(); } } ``` 上述方法基于基本的循环结构与条件判断[^4]。 --- #### B. Another Problem Title 该问题涉及贪心算法的应用场景。通常情况下,我们需要对数组进行排序并逐步优化目标函数值。例如,在给定条件下最大化某个表达式的取值范围。 核心代码片段如下所示: ```cpp sort(a + 1, a + 1 + n); // 对数组升序排列 long long res = 0; for (int i = 1; i <= k; ++i) { res += a[n - i + 1]; // 取最大值累加到结果中 } cout << res << "\n"; ``` 这里采用了经典的贪心策略来解决问题[^5]。 --- #### C. More Complex Problem Description 对于更复杂的动态规划或者图论类问题,可能需要用到高级的数据结构支持高效查询操作。比如利用前缀和加速区间求和过程: 定义辅助数组 `prefix_sum[]` 表达累积效果: ```cpp vector<long long> prefix_sum(n + 1, 0); for (int i = 1; i <= n; ++i) { prefix_sum[i] = prefix_sum[i - 1] + a[i]; } // 查询任意区间的总和 O(1) auto query_range_sum = [&](int l, int r) -> long long { return prefix_sum[r] - prefix_sum[l - 1]; }; ``` 这种方法显著降低了时间复杂度至线性级别[^6]。 --- #### D. Advanced Algorithmic Challenge 当面对更高难度的任务时,往往需要结合多种技巧共同完成任务。例如构建二分图匹配模型并通过匈牙利算法寻找最优配对方案;又或者是设计状态转移方程解决背包型子集划分难题等等。 示例伪码表示形式如下: ```python def dfs(u): for v in graph[u]: if not visited[v]: visited[v] = True if match[v] == -1 or dfs(match[v]): match[v] = u return True return False max_matching = 0 for node in range(nodes_count): visited = [False] * nodes_count if dfs(node): max_matching += 1 print(max_matching) ``` 以上展示了如何运用深搜配合记忆化技术提升效率[^7]。 --- ### 结语 综上所述,针对不同类型的竞赛编程挑战提供了相应的理论依据和技术手段说明。希望这些内容对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值