链接
点击跳转
题解
∑
a
i
<
Y
\sum a_i < Y
∑ai<Y也就意味着
∏
a
i
!
<
Y
\prod a_i! < Y
∏ai!<Y
所以答案至少是
0
0
0
那么我只需要对
X
X
X分解质因数,然后看一下每个质因数还能允许我容纳几个
x
x
x就可以了
分解质因数用Pollard Rho算法
代码
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define iinf 0x3f3f3f3f
#define linf (1ll<<60)
#define eps 1e-8
#define maxn 1000010
#define maxe 1000010
#define cl(x) memset(x,0,sizeof(x))
#define rep(i,a,b) for(i=a;i<=b;i++)
#define drep(i,a,b) for(i=a;i>=b;i--)
#define em(x) emplace(x)
#define emb(x) emplace_back(x)
#define emf(x) emplace_front(x)
#define fi first
#define se second
#define de(x) cerr<<#x<<" = "<<x<<endl
using namespace std
;
using namespace __gnu_pbds
;
typedef long long ll
;
typedef pair
<int,int> pii
;
typedef pair
<ll
,ll
> pll
;
ll
read(ll x
=0)
{
ll c
, f(1);
for(c
=getchar();!isdigit(c
);c
=getchar())if(c
=='-')f
=-f
;
for(;isdigit(c
);c
=getchar())x
=x
*10+c
-0x30;
return f
*x
;
}
struct Pollard_Rho
{
ll
md(ll x
, ll p
){while(x
>p
)x
-=p
;return x
;}
ll
mult(ll a
, ll b
, ll p
)
{
ll ans
=0, t
=a
;
for(;b
;b
>>=1,t
=md(t
+t
,p
))if(b
&1)ans
=md(ans
+t
,p
);
return ans
;
}
ll
pow(ll a
, ll b
, ll p
)
{
ll ans
=1, t
=a
;
for(;b
;b
>>=1,t
=mult(t
,t
,p
))if(b
&1)ans
=mult(ans
,t
,p
);
return ans
;
}
bool MR(ll n
)
{
ll a
, t
, u
, i
, x
, y
, tim
=20;
if(n
==2)return true;
if(~n
&1)return false;
if(n
==3 or n
==5)return true;
if(n
%3==0 or n
%5==0)return false;
for(t
=0,u
=n
-1;~u
&1;u
>>=1,t
++);
while(tim
--)
{
a
=rand()%(n
-1)+1;
for(y
=x
=pow(a
,u
,n
),i
=1;i
<=t
;i
++)
{
x
=mult(x
,x
,n
);
if(x
==1 and y
!=n
-1 and y
!=1)return false;
y
=x
;
}
if(x
!=1)return false;
}
return true;
}
ll
pollard_rho(ll n
, ll c
)
{
ll i
, k
, x
=rand()%n
, y
=x
, d
;
for(i
=1,k
=2;;i
++)
{
x
=(mult(x
,x
,n
)+c
)%n
;
d
=__gcd(y
>x
?y
-x
:x
-y
,n
);
if(d
>1 and d
<n
)return d
;
if(x
==y
)return n
;
if(i
==k
)y
=x
,k
<<=1;
}
}
void find(ll n
, ll c
, map
<ll
,ll
>& ans
)
{
if(n
==1)return;
if(MR(n
)){ans
[n
]++;return;}
ll p
=pollard_rho(n
,c
);
for(;p
==n
;c
++)p
=pollard_rho(n
,c
);
find(p
,c
,ans
), find(n
/p
,c
,ans
);
}
map
<ll
,ll
> run(ll n
)
{
map
<ll
,ll
> ans
;
find(n
,1,ans
);
return ans
;
}
};
int main()
{
ll T
=read();
Pollard_Rho PR
;
while(T
--)
{
ll N
=read(), X
=read(), Y
=read(), i
;
vector
<ll
> a(N
+5);
rep(i
,1,N
)a
[i
]=read();
auto lis
= PR
.run(X
);
ll ans
=linf
;
for(auto pr
:lis
)
{
ll cnt
=0;
rep(i
,1,N
)
{
ll t
=a
[i
], p
=0;
while(t
)
{
p
+= t
/pr
.first
;
t
/=pr
.first
;
}
cnt
-= p
;
}
ll t
=Y
, p
=0;
while(t
)
{
p
+= t
/pr
.first
;
t
/=pr
.first
;
}
cnt
+= p
;
ans
= min(ans
,cnt
/pr
.second
);
}
printf("%lld\n",ans
);
}
return 0;
}