• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
fervor
博客园    首页    新随笔    联系   管理    订阅  订阅

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;
}
posted @ 2026-04-22 20:28  fervor  阅读(7)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3