传送门
题目大意
两个整数
x
x
x和
y
y
y是有关的当
l
c
m
(
x
,
y
)
g
c
d
(
x
,
y
)
\frac{lcm(x,y)}{gcd(x,y)}
gcd(x,y)lcm(x,y)
给你一个长度为
n
n
n的序列
a
a
a。每一秒,所有的
a
i
a_i
ai都会变成序列中所有和它有关的数的乘积。
令
d
i
d_i
di为数列中与
a
i
a_i
ai有关的数的个数。
q
q
q次询问,每次询问给出一盒
w
w
w,求在
w
w
w秒时的
m
a
x
(
d
i
)
max(d_i)
max(di)
思路
代码
const int maxn = 3e5+7;
const ll mod = 1e9+7;
const ll INF=5e18+7;
const int inf=1e9+7;
const ll maxx=1e6+700;
int n;
int a[maxn];
int q;
ll w;
struct node{
int x;
int cnt;
}str[maxn];
map<int,int>mp;
void init(int x){
for(int i=2;i*i<=x;i++){
if(x%i==0){
int cnt1=0;
while(x%i==0){
cnt1++;
x/=i;
}
if(cnt1%2) x*=i;
}
}
mp[x]++;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
mp.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
init(a[i]);
}
int ans1=0,ans2=0;
map<int,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
ans1=max(ans1,it->second);
if(it->second%2==0||it->first==1){
ans2+=it->second;
}
}
ans2=max(ans1,ans2);
scanf("%d",&q);
while(q--){
scanf("%lld",&w);
if(w==0){
printf("%d\n",ans1);
}
else{
printf("%d\n",ans2);
}
}
}
}