菜鸡开始写题解了,613div2 C. Fadi and LCM

C. Fadi and LCM
题目地址
在这里插入图片描述
教训:
没仔细看题,直接3wa。
后面看清楚了一直到contest结束一直wa。qwq。

题意:

  1. lcm:最大公倍数(可能英语彩鸡不知道)
  2. 本题给你一个数x要找到两个数的lcm(a,b)=x;且要满足找到的两个数max(a,b)最小。

题解:
对于一个数eg:x=6。可以是(1,6)(2,3)
(1,6)是不行,不是最优解。因为max(1,6)=6;
而(2,3)行,因为max(2,3)<max(1,6);

下面介绍两种思路。

  1. 暴力枚举
    1) 因为是求lcm。根据上面的(2,3)可知,gcd(a,b)==1
    (a,和b应该互质)而sqrt(x)为1e6的范围(x最大1e12).
    2)所以综上开始暴力,找每个是x的因子 a,并求出b=x/a;
    在通过更新最优解来输出答案。具体看代码
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int  maxn=1e6+10;
ll vis[maxn],prime[maxn];
ll pre[maxn];
vector<ll>v;
ll gcd(ll a, ll b)
{
    if(b==0)return a;
    return gcd(b,a%b);//求是否互质
}
int main()
{
    //cout<<gcd(392863,510510)<<endl;
    ll n;
    ll a,b,mid;
    cin>>n;
    mid=sqrt(n+0.5);
    a=n,b=1;//初始化。并以a,b来存值
    for(int i=1; i<=mid; i++)
    {//开始暴力
        ll x,y;
        if(n%i==0)
        {
            x=i,y=n/i;
            if(gcd(x,y)==1)//==1,就是互质
            {
                if(max(x,y)<max(a,b))
                {
                    a=x;//更新最优解
                    b=y;
                }
            }
        }
    }
    cout<<min(a,b)<<' '<<max(a,b);
    return 0;
}
  1. 质因分解:
    1)一个数总能拆成多个质数相乘。
    2)把x质因分解,并把每个素因子存放到vector里。
    3)最后dfs。
    合理性分析:
    因为2357…31(最多12个)<=1e12.(由此可以证明前面分解的质数,最多有12个)
    dfs的复杂度是2^12所以不会tle。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
ll ans=0;//存a,b里最小的
vector<ll>v;
void dfs(ll a,ll b, int tot)
{
    if(tot>=v.size())
    {
        ans=min(ans,max(a,b));
        return;
    }
    dfs(a*v[tot],b,tot+1);
    dfs(a,b*v[tot],tot+1);
}
int main()
{
    ll x,xx;
    ll t=1;
    cin>>x;
    xx=x;
    ans=xx;
    for(ll i=2; i*i<=x; i++)
    {
        if(x%i==0)
        {
            t=1;
            while(x%i==0)
            {
                t*=i;
                x/=i;
            }
            v.push_back(t);
        }
    }
    //cout<<"ok"<<endl;
    if(x>1)v.push_back(x);//这里要注意。因为可能分解时还有剩
    sort(v.begin(),v.end());//对里面的质因子排序(2^x1...7^x2)
    //题目中的x1和x2因题而异,所以要排序,不知哪个更大。
    dfs(1,1,0);//开始暴力dfs
    cout<<xx/ans<<' '<<ans<<endl;
    return 0;
}
发布了8 篇原创文章 · 获赞 8 · 访问量 76

猜你喜欢

转载自blog.csdn.net/qq_45377553/article/details/105442885