日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF思维联系–CodeForces - 222 C Reducing Fractions(数学+有技巧的枚举)

發布時間:2023/12/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF思维联系–CodeForces - 222 C Reducing Fractions(数学+有技巧的枚举) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ACM思維題訓練集合
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 n, m (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,?mout must 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.

Examples
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.


日常WA一天
不看跑的數據,我都不知道自己怎么錯的,老天爺。我的輸出超出了限制100001不能超過100000,我覺得那時候,那些沒有過的,一定是這個原因,出題人真是喪心病狂。
第一個代碼是錯的,第二個是修改了的,換了方式。

#include <bits/stdc++.h> using namespace std; template <typename t> void read(t &x) {char ch = getchar();x = 0;int f = 1;while (ch < '0' || ch > '9')f = (ch == '-' ? -1 : f), ch = getchar();while (ch >= '0' && ch <= '9')x = x * 10 + ch - '0', ch = getchar();x *f; } bitset<100000010> v; int prime[6000001]; int m = 0; void primes(int n) {for (int i = 2; i * i <= n; i++){if (!v[i]){for (int j = i * i; j <= n; j += i)v[j] = 1;}}for (int i = 2; i <= n; i++)if (!v[i])prime[m++] = i; } vector<int> a[4]; unordered_map<int, int> c, d; int main() {int n, m, maxi = 0;read(n), read(m);primes(10000005);for (int i = 0; i < n; i++){int tem;read(tem);maxi = max(maxi, tem);c[tem]++;}for (int i = 0; i < m; i++){int tem;read(tem);maxi = max(maxi, tem);d[tem]++;}//cout << 1 << endl;for (int i = 0; prime[i] <= maxi; i++){// cout<<i<<endl;int cnt = 0, ans = 0, cnt2 = 0;int flag = 1;for (auto po = c.begin(); po != c.end();){// cout<<1<<endl;pair<int, int> tem = *po;cnt = 0;if (tem.first < prime[i]){po++;continue;}else{flag = 0;while (tem.first % prime[i] == 0){tem.first /= prime[i];cnt++;//cout<<i<<endl;}cnt *= tem.second;auto pi = po;po++;c.erase(pi);if (tem.first != 1)c[tem.first] += tem.second;}ans += cnt;}cnt2 = ans;ans = 0;for (auto po = d.begin(); po != d.end();){pair<int, int> tem = *po;cnt = 0;if (tem.first < prime[i]){po++;continue;}else{flag = 0;while (tem.first % prime[i] == 0){tem.first /= prime[i];cnt++;//cout<<i<<endl;}cnt *= tem.second;auto pi = po;po++;d.erase(pi);if (tem.first != 1)d[tem.first] += tem.second;}ans += cnt;}cnt = cnt2 - ans;if (cnt == 0)continue;else if (cnt < 0){cnt = -cnt;int temp = 1;int j = 0;for (; j < cnt; j++){temp *= prime[i];if (temp * prime[i] > 10000000){a[3].push_back(temp);// cout << 1 << endl;temp = 1;}}a[3].push_back(temp);}else{int temp = 1;int j = 0;for (; j < cnt; j++){temp *= prime[i];if (temp * prime[i] > 10000000){a[2].push_back(temp);// cout << 1 << endl;temp = 1;}}a[2].push_back(temp);}if (flag)break;}if (a[2].size() == 0)a[2].push_back(1);if (a[3].size() == 0)a[3].push_back(1);cout << a[2].size() << " " << a[3].size() << endl;for (int i = 0; i < a[2].size(); ++i)printf("%d ", a[2][i]);puts("");for (int i = 0; i < a[3].size(); ++i)printf("%d ", a[3][i]);puts(""); } #include <bits/stdc++.h> using namespace std; typedef long long LL;int n, m, tot, a[100005], b[100005], z[10000005], pos[10000005], q[1000005], t1[1000005], t2[1000005];int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i)scanf("%d", &a[i]);for (int i = 1; i <= m; ++i)scanf("%d", &b[i]);for (int i = 2; i <= 10000000; ++i)if (!z[i]){for (int j = i; j <= 10000000; j += i)z[j] = i;q[++tot] = i;pos[i] = tot;}for (int i = 1; i <= n; ++i){int k = a[i];while (k != 1){t1[pos[z[k]]]++;k /= z[k];}}for (int i = 1; i <= m; ++i){int k = b[i];while (k != 1){t2[pos[z[k]]]++;k /= z[k];}}for (int i = 1; i <= tot; ++i){t1[i] = min(t1[i], t2[i]);t2[i] = t1[i];}printf("%d %d\n", n, m);for (int i = 1; i <= n; ++i){int k = a[i], p = a[i];while (k != 1){if (t1[pos[z[k]]]){p /= z[k];t1[pos[z[k]]]--;}k /= z[k];}printf("%d ", p);}printf("\n");for (int i = 1; i <= m; ++i){int k = b[i], p = b[i];while (k != 1){if (t2[pos[z[k]]]){p /= z[k];t2[pos[z[k]]]--;}k /= z[k];}printf("%d ", p);}printf("\n");return 0; }

總結

以上是生活随笔為你收集整理的CF思维联系–CodeForces - 222 C Reducing Fractions(数学+有技巧的枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。