№ |
Отправитель |
Задача |
Язык |
Вердикт |
Время |
Память |
Отослано |
Протест. |
|
223594473 |
Дорешивание:
-WIDA- |
1225D
- 12
|
C++20 (GCC 11-64)
|
Полное решение
|
780 мс
|
11764 КБ
|
2023-09-16 12:46:04 |
2023-09-16 12:46:04 |
|
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
#ifndef ONLINE_JUDGE
#define tout cout
#include <bits/wida.h>
#endif
#define endl "\n"
#define int long long
struct String {
int MOD, BASE;
vector<int> val;
String(int MOD, int BASE, int N) {
init(MOD, BASE, N);
}
void init(int MOD, int BASE, int N) {
this->MOD = MOD;
this->BASE = BASE;
val.resize(N + 1);
val[0] = 1;
for (int i = 1; i <= N; i++) {
val[i] = (val[i - 1] * BASE) % MOD;
}
}
int get(const string &s) {
int ans = 0;
for (auto i : s) {
ans = (ans * BASE + i) % MOD;
}
return ans;
}
int operator[](const int &s) {
return val[s];
}
int operator[](const string &s) {
return get(s);
}
int modify(int x, string &s, int idx, char now) {
int n = s.size() - 1;
return (x + val[n - idx] * (now - s[idx]) % MOD + MOD) % MOD;
}
};
using namespace __gnu_pbds;
struct myhash {
static uint64_t splitmix64(uint64_t x) {
x += 0x9e3779b97f4a7c15;
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
return x ^ (x >> 31);
}
size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM =
chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM);
}
};
#define MAP gp_hash_table
const int N = 1E5;
const int mod = 1E9 + 7;
const int base = 127;
signed main() {
vector<int> prime; // 这里储存筛出来的全部质数
auto euler_Prime = [&](int n) -> void {
vector<int> v(n + 1);
for (int i = 2; i <= n; ++i) {
if (!v[i]) {
v[i] = i;
prime.push_back(i);
}
for (int j = 0; j < prime.size(); ++j) {
if (prime[j] > v[i] || prime[j] > n / i) break;
v[i * prime[j]] = prime[j];
}
}
};
euler_Prime(N);
String hash(mod, base, N);
int n, k;
cin >> n >> k;
MAP<int, int, myhash> dic;
int ans = 0;
for (int i = 1; i <= n; ++i) {
int x;
cin >> x;
int Hash = 0, TargetHash = 0;
for (auto it : prime) {
if (it > x) break;
int cnt = 0;
while (x % it == 0) {
x /= it;
++cnt;
}
Hash += hash[it] * (cnt % k);
if (cnt % k) {
TargetHash += hash[it] * (k - (cnt % k));
}
}
ans += dic[TargetHash];
++dic[Hash];
}
cout << ans;
}
int __OI_INIT__ = []() {
ios::sync_with_stdio(0), cin.tie(0);
cout.tie(0);
cout << fixed << setprecision(12);
return 0;
}();
Время: ? ms, память: ? КБ