社区讨论
求救E
学术版参与者 3已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mlmdbkv9
- 此快照首次捕获于
- 2026/02/14 21:44 5 天前
- 此快照最后确认于
- 2026/02/18 16:35 20 小时前
我先写了个暴力确认一下:
CPP#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int maxn=2e5+5;
const int mod=998244353;
struct node{
int number;
int cishu;
bool operator<(const node& a) const {
return number<a.number;
}
};
int T;
int n,a[maxn];
vector<node> G[maxn];
vector<int> num;
int read(){
int su=0,pp=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')pp=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){su=su*10+ch-'0';ch=getchar();}
return su*pp;
}
int ksm(int a,int b){
int ans=1;
a%=mod;
while(b){
if(b&1){
ans=(ans*a)%mod;
}
a=(a*a)%mod;
b>>=1;
}
return ans;
}
int ask(int k){
int ans=1;
for(int idx=0;idx<num.size();idx++){
int p=num[idx];
int max_cishu=0;
for(int i=1;i<=n;i++){
if(i==k) continue;
int lt=-1,rt=G[i].size();
while(lt+1<rt){
int mid=(lt+rt)>>1;
if(G[i][mid].number>=p){
rt=mid;
}
else{
lt=mid;
}
}
if(rt<G[i].size()&&G[i][rt].number == p){
max_cishu=max(max_cishu,G[i][rt].cishu);
}
}
if(max_cishu>0){
ans=(ans*ksm(p,max_cishu))%mod;
}
}
return ans;
}
void work(){
n=read();
num.clear();
for(int i=1;i<=n;i++){
G[i].clear();
}
map<int,bool>vis;
for(int i=1;i<=n;i++){
a[i]=read();
int tmp=a[i];
for(int j=2;j*j<=tmp;j++){
if(tmp%j==0){
int cnt=0;
while(tmp%j==0){
cnt++;
tmp/=j;
}
G[i].push_back({j,cnt});
if(!vis[j]){
vis[j]=true;
num.push_back(j);
}
}
}
if(tmp>1){
G[i].push_back({tmp,1});
if(!vis[tmp]){
vis[tmp]=true;
num.push_back(tmp);
}
}
//sort(G[i].begin(),G[i].end());
}
for(int k=1;k<=n;k++){
printf("%u ",ask(k));
}
printf("\n");
return ;
}
signed main(){
T=read();
while(T--){
work();
}
return 0;
}
然后我又有个疑似正解想法:
就是说我定义 pre[i] 表示前缀lcm,再定义suf[i] 表示后缀suf。最后简单处理即可,可以这样吗。还是一样的分解质因数
回复
共 7 条回复,欢迎继续交流。
正在加载回复...