社区讨论

【玄小号关】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 条回复,欢迎继续交流。

正在加载回复...