Title

CF1916B Two Divisors 题解

解题思路

因为要求 abx 的两个最大的因数(不包括本身),那么我们可以先找出 ab 的最小公倍数,然后和 b 比较,如果和 b 相同,那么我们再找到 ab 的最小的非 1 因数,和 b 相乘就是答案了。

AC 代码

#include<iostream>
#include<math.h>
#include<time.h>
#include<stdio.h>
#include<algorithm>
#define ll long long
#define N 100005
ll a,b,p[N];int cnt;
inline bool Prim(int x){
    for(register int i=2;i*i<=x;++i)
        if(x%i==0) return false;
    return true;
}
inline void init(){
    for(register int i=2;i<=100000;++i)
        if(Prim(i)) p[++cnt]=i;
}
inline void work(){
    scanf("%lld%lld",&a,&b);
    ll ans=(a*b)/std::__gcd(a,b);
    if(ans!=b){
        printf("%lld\n",ans);
        return;
    }
    ll minta=(a==1?1e9:a),mintb=b;
    for(register ll i=1;p[i]*p[i]<=a&&i<=cnt;++i){
        if(a%p[i]==0){minta=p[i];break;}
    }
    for(register ll i=1;p[i]*p[i]<=b&&i<=cnt;++i){
        if(b%p[i]==0){mintb=p[i];break;}
    }
    ans*=std::min(minta,mintb);
    printf("%lld\n",ans);
}signed main(){
    srand(114514);
    srand(rand());
    srand(time(0));
    init();
    int T;scanf("%d",&T);
    while(T--) work();
    system("pause");
}
posted @   UncleSam_Died  阅读(21)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示