2023湖北省赛I题(质因数分解+exgcd)
感觉这道题挺有思维含量的,比前6道题出的好太多,赛时队友exgcd写挂了,但不妨碍这是到好题。(先放个初始版本)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
const int maxn=1e7;
bool vis[maxn+2];
int cnt[maxn+2];
vector<int>prim;
void init(){
vis[1]=1;
for(int i=2;i<=maxn;i++){
if(!vis[i]){
prim.push_back(i);
for(int j=i*i;j<=maxn;j+=i){
vis[j]=1;
}
}
}
}
signed main(){
IOS;
init();
int n;
cin>>n;
vector<int>ans;
for(int i=1;i<=n;i++){
int a;
cin>>a;
for(auto i:prim){
if(a==1){
break;
}
if(!vis[a]){
if(!cnt[a]){
ans.push_back(a);
}
cnt[a]=max(cnt[a],1ll);
break;
}
int tmp=0;
while(a%i==0){
a/=i;
tmp++;
}
if(!cnt[i]&&tmp){
ans.push_back(i);
}
cnt[i]=max(cnt[i],tmp);
if(a==1){
break;
}
if(!vis[a]){
if(!cnt[a]){
ans.push_back(a);
}
cnt[a]=max(cnt[a],1ll);
break;
}
}
}
vector<int>tans;
if(!cnt[2]){
ans.push_back(2);
}
cnt[2]++;
for(auto x:ans){
int tmp=1;
for(int i=1;i<=cnt[x];i++){
tmp*=x;
}
tans.push_back(tmp);
}
int tn=tans.size(),tp=1e18;
auto exgcd=[&](auto &&exgcd,int a,int b,int &x,int &y)->int{
if(!b){
x=1,y=0;
return a;
}else{
int d=exgcd(exgcd,b,a%b,x,y);
int tmp=x;
x=y,y=tmp-a/b*y;
return d;
}
};
auto dfs=[&](auto &&dfs,int step,int l,int r)->void{
if(step==tn){
int a=l,b=r,x,y;
exgcd(exgcd,l,r,x,y);
x=((-x)%r+r)%r;
if(x) tp=min(tp,x*l);
else tp=min(tp,r*l);
return;
}
dfs(dfs,step+1,l*tans[step],r);
dfs(dfs,step+1,l,r*tans[step]);
};
dfs(dfs,0,1,1);
cout<<tp;
return 0;
}
浙公网安备 33010602011771号