题解:P17735 [ICPC 2019 Xuzhou R] Multiply
_Sorasaki_Hina_ · · 题解
碎碎念
思维难度严格小于代码模板。
sol
实际上就是说
比如说
这个就很简单的数论啊,比如我们设
我们先把
然后统计
解释一下为什么是
然后在代码里不需要真的求出
发现困难的是做
最后的时间复杂度是
然后就是不要学煮波赛时求的
code
const int N = 1e5 + 2 ;
int T,n ;
ll x,y,a[N] ;
int tot,b[105] ;
ll p[105] ;
mt19937_64 rng(67676767) ;
vector<ll> tmp ;
inline ll qpow (ll a,ll b,fl mod) {
ll res = 1 ; a %= mod ;
while (b) {
if (b & 1) res = (lll)res * a % mod ;
a = (lll)a * a % mod ;
b >>= 1 ;
}
return res ;
}
inline bool mr (fl n) {
if (n < 2) return false ;
if (n == 2 || n == 3 || n == 5 || n == 7) return true ;
if (n % 2 == 0 || n % 3 == 0 || n % 5 == 0 || n % 7 == 0) return false ;
static const ll bases[] = {2,3,5,7,11,13,17,19,23,29,31,37} ;
ll d = n - 1,s = 0 ;
while (!(d & 1)) d >>= 1,++s ;
for (re int i = 0 ; i < 12 ; ++i) {
ll a = bases[i] ;
if (n <= a) break ;
ll x = qpow(a,d,n) ;
if (x == 1 || x == n - 1) continue ;
bool ok = false ;
for (re int r = 1 ; r < s ; ++r) {
x = (lll)x * x % n ;
if (x == n - 1) {ok = true ; break ;}
}
if (!ok) return false ;
}
return true ;
}
inline ll rho (fl n) {
ll s = 0,t = 0,c = rng() % (n - 1) + 1,val = 1 ;
for (re int goal = 1 ; ; goal <<= 1,s = t,val = 1) {
for (re int step = 1 ; step <= goal ; ++step) {
t = ((lll)t * t + c) % n ;
val = (lll)val * (s > t ? s - t : t - s) % n ;
if (step % 127 == 0) {
ll d = __gcd(val,n) ;
if (d > 1) return d ;
}
}
ll d = __gcd(val,n) ;
if (d > 1) return d ;
}
}
inline void dfs (fl n) {
if (n <= 1) return ;
if (mr(n)) {tmp.push_back(n) ; return ;}
ll d = n ;
while (d >= n) d = rho(n) ;
dfs(d) ;
dfs(n / d) ;
}
inline void init (fl n) {
tot = 0 ;
tmp.clear() ;
dfs(n) ;
sort(tmp.begin(),tmp.end()) ;
for (re int i = 0 ; i < tmp.size() ; ++i) {
if (!tot || p[tot] != tmp[i]) p[++tot] = tmp[i],b[tot] = 1 ;
else ++b[tot] ;
}
}
inline ll fun (ll v,ll t) {
ll res = 0 ;
while (v) v /= t,res += v ;
return res ;
}
inline ll calc () {
ll tmp,res = LLONG_MAX ;
for (re int i = 1 ; i <= tot ; ++i) {
tmp = fun(y,p[i]) ;
for (re int j = 1 ; j <= n ; ++j) tmp -= fun(a[j],p[i]) ;
res = min(res,tmp / b[i]) ;
}
return res ;
}
inline void solve () {
read(n,x,y) ;
init(x) ;
for (re int i = 1 ; i <= n ; ++i) read(a[i]) ;
return write(calc(),endl) ;
}
int main () {
read(T) ;
while (T--) solve() ;
return 0 ;
}