社区讨论
【玄小号关】abc-E 样例死循环(?) 求助
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlmeus4s
- 此快照首次捕获于
- 2026/02/14 22:27 5 天前
- 此快照最后确认于
- 2026/02/15 12:48 4 天前
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 200010;
const ll mod = 998244353;
ll t,n,a[MAXN];
vector<ll> v[MAXN];
map<ll,multiset<ll,greater<ll> > > mp;
map<ll,map<ll,ll> > m;
ll modpow(ll a,ll b){
ll res = 1;
a %= mod;
while(b){
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int main(){
cin >> t;
while(t--){
mp.clear();
m.clear();
cin >> n;
for(int i = 1;i <= n;i++) v[i].clear();
ll ans = 1;
for(int i = 1;i <= n;i++){
cin >> a[i];
for(int j = 2;j * j <= a[i];j++){
bool ok = false;
ll cnt = 0;
while(a[i] % j == 0){
ok = true;
a[i] /= j;
cnt++;
}
if(ok){
v[i].push_back(j);
mp[j].insert(cnt);
if(mp[j].size() > 2) mp[j].erase(*(--mp[j].end()));
m[i][j] = cnt;
}
}
if(a[i] > 1){
v[i].push_back(a[i]);
mp[a[i]].insert(1);
if(mp[a[i]].size() > 2) mp[a[i]].erase(*(--mp[a[i]].end()));
m[i][a[i]] = 1;
}
}
for(auto i:mp){
ll nn = *(i.second.begin());
for(int j = 1;j <= nn;j++){
ans = ans * i.first % mod;
}
}
for(int i = 1;i <= n;i++){
ll k = ans;
for(auto j:v[i]){
ll l;
if(mp[j].size() == 1) l = -1;
else l = *(++mp[j].begin());
if(*(mp[j].begin()) != m[i][j] || l == *(mp[j].begin())) continue;
ll mod2 = modpow(j,mod - 2);
for(int kk = 1;kk <= m[i][j];kk++) k = k * mod2 % mod;
ll nn;
if(mp[j].size() > 1) nn = *(++mp[j].begin());
else nn = 0;
for(int kk = 1;kk <= nn;kk++) k = k * j % mod;
}
cout << k % mod << " ";
}
cout << endl;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...