题目传送门
sol1:老实做,预处理出所有2到1e5的素数,对所有数进行分解质因数,然后对比因子个数。感觉有点卡常,用了快读然后多次优化之后才过的,map也用上了。
- 素数筛,快速分解质因数
#include "bits/stdc++.h" using namespace std; typedef long long LL; const int MAXN = 1e5 + 10; bool v[MAXN]; map<int, int> mp; int p[MAXN], pos; int a[MAXN], b[MAXN]; LL ca[MAXN], cb[MAXN]; void init() { for (int i = 2; i <= 1e5; i++) { if (v[i] == false) { p[++pos] = i; mp[i] = pos; for (int j = i << 1; j <= 1e5; j += i) v[j] = true; } } } inline int read() { int n = 0; char c = getchar(); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') { n = n * 10 + (c ^ '0'); c = getchar(); } return n; } void fun(int k, int c, LL* a) { for (int i = 1; v[k]; i++) { while (k % p[i] == 0) { k /= p[i]; a[i] += c; } } if (k != 1) a[mp[k]] += c; } int main() { init(); int t, n, m, k; t = read(); while (t--) { n = read(), m = read(); memset(ca, 0, sizeof(LL) * (pos + 1)); memset(cb, 0, sizeof(LL) * (pos + 1)); for (int i = 1; i <= n; i++) a[i] = read(); for (int i = 1; i <= m; i++) b[i] = read(); sort(a + 1, a + 1 + n); sort(b + 1, b + 1 + m); k = 1; for (int i = 1; i <= a[n]; i++) { while (i > a[k]) k++; fun(i, n - k + 1, ca); } k = 1; for (int i = 1; i <= b[m]; i++) { while (i > b[k]) k++; fun(i, m - k + 1, cb); } bool ok = true; for (int i = 1; i <= pos; i++) { if (ca[i] != cb[i]) { ok = false; break; } } if (ok) puts("equal"); else puts("unequal"); } return 0; }
sol2:题解上说用哈希。虽然一开始也有想到哈希,但是怕哈希冲突,没怎么在比赛中用过哈希,没有哈希的意识。知道用哈希之后代码就信手拈来了,不过还是产生了一次哈希冲突,不要用1e9 + 7这种特殊素数,决定还是使用2147483587(int范围第二大的素数,怕最大的会被卡)。
- 哈希
#include "bits/stdc++.h" using namespace std; const int MAXN = 1e5 + 10; const int MOD = 2147483587; int a[MAXN], b[MAXN]; int quick_pow(int n, int k) { int ans = 1; while (k) { if (k & 1) ans = 1LL * ans * n % MOD; n = 1LL * n * n % MOD; k >>= 1; } return ans; } int main() { int t, n, m, k; scanf("%d", &t); while (t--) { 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]); sort(a + 1, a + 1 + n); sort(b + 1, b + 1 + m); int ha = 1, hb = 1; k = 1; for (int i = 1; i <= a[n]; i++) { while (i > a[k]) k++; ha = 1LL * ha * quick_pow(i, n - k + 1) % MOD; } k = 1; for (int i = 1; i <= b[m]; i++) { while (i > b[k]) k++; hb = 1LL * hb * quick_pow(i, m - k + 1) % MOD; } if (ha == hb) puts("equal"); else puts("unequal"); } return 0; }