QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#748806 | #9705. Multiply | HUY1 | RE | 0ms | 3564kb | C++20 | 2.5kb | 2024-11-14 21:30:28 | 2024-11-14 21:30:33 |
Judging History
answer
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define MAXN 200005
ll mul(ll a, ll b, ll m) {
ll r = a * b - m * (ll)(1.L / m * a * b);
return r - m * (r >= m) + m * (r < 0);
}
ll mypow(ll a, ll b, ll m) {
ll res = 1 % m;
for (; b; b >>= 1, a = mul(a, a, m)) {
if (b & 1) {
res = mul(res, a, m);
}
}
return res;
}
ll B[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
bool MR(ll n) {
if (n <= 1) return 0;
for (ll p : B) {
if (n == p) return 1;
if (n % p == 0) return 0;
}
ll m = (n - 1) >> __builtin_ctz(n - 1);
for (ll p : B) {
ll t = m, a = mypow(p, m, n);
while (t != n - 1 && a != 1 && a != n - 1) {
a = mul(a, a, n);
t *= 2;
}
if (a != n - 1 && t % 2 == 0) return 0;
}
return 1;
}
ll PR(ll n) {
for (ll p : B) {
if (n % p == 0) return p;
}
auto f = [&](ll x) -> ll {
x = mul(x, x, n) + 1;
return x >= n ? x - n : x;
};
ll x = 0, y = 0, tot = 0, p = 1, q, g;
for (ll i = 0; (i & 255) || (g = __gcd(p, n)) == 1; i++, x = f(x), y = f(f(y))) {
if (x == y) {
x = tot++;
y = f(x);
}
q = mul(p, abs(x - y), n);
if (q) p = q;
}
return g;
}
vector<ll> fac(ll n) {
#define pb emplace_back
if (n == 1) return {};
if (MR(n)) return {n};
int d = PR(n);
auto v1 = fac(d), v2 = fac(n / d);
auto i1 = v1.begin(), i2 = v2.begin();
vector<ll> ans;
while (i1 != v1.end() || i2 != v2.end()) {
if (i1 == v1.end()) {
ans.pb(*i2++);
} else if (i2 == v2.end()) {
ans.pb(*i1++);
} else {
if (*i1 < *i2) {
ans.pb(*i1++);
} else {
ans.pb(*i2++);
}
}
}
return ans;
}
ll a[MAXN];
ll c[MAXN];
void solve()
{
ll n, x, y;
cin >> n >> x >> y;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
ll t = x;
auto p = fac(x);
for (int i = 0; i < p.size(); i++) {
ll t = x, cnt = 0;
while (t % p[i] == 0) {
cnt++;
t /= p[i];
}
c[i] = cnt;
}
ll res = 1e18;
for (int i = 0; i < p.size(); i++) {
ll pp = p[i], cc = c[i];
ll c1 = 0, c2 = 0;
for (int j = 1; j <= n; j++) {
ll t = a[j];
while (t) {
c1 += t / pp;
t /= pp;
}
}
ll t = y;
while (t) {
c2 += t / pp;
t /= pp;
}
res = min(res, (c2 - c1) / cc);
}
cout << res << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
/*
2
3 10 10
2 3 4
2 2 10
1 1
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3564kb
input:
2 3 10 10 2 3 4 2 2 10 1 1
output:
2 8
result:
ok 2 number(s): "2 8"
Test #2:
score: -100
Runtime Error
input:
8 929 98210021061137 164832982985885580 43576998167336 157303878397705 212661169553039 169068044677212 17733912750082 101059786177542 56528418806042 170741049344189 128297164019222 208810463591190 96264177952672 70816863413347 116985928070432 56330014332760 10006522486360 110959002803542 15298525649...
output:
1059 95837140 1761303730724