ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021牛客多校5 G Greater Integer, Better LCM

2021-08-01 18:02:54  阅读:222  来源: 互联网

标签:const Greater int 多校 Better fa fb lll include


传送门

题意:给你3个数 \(a,b,c\),你需要找出 \(x,y\)两个数,使得
\(lcm(a+x,b+y)=c\),同时最小化\((x+y)\)的值,输出这个最小的\((x+y)\).
\(a,b,c\)都很大,因此需要用__int128 输入输出,需要用快读快输来输入,同时\(c\)是以质因数分解的形式给出的,其因子个数\(n\)给定且不大于18,其质因数分解后指数位置的数的和不大于18

那么,当我们看到18这个数时,很容易联想到二进制枚举,即根据最小公倍数的性质 , 我们 通过二进制枚举 来判断 \(a\)和\(b\)谁来承担\(c\)的每个底数的最大指数\(p_i^{q_j}\)
同时 \((a+x)\)和\((b+y)\)一定是\(c\)的因数,那么就相当于,我们需要找到 \(c\)的一个因数\((a+x)\),使得\((a+x)\)在满足我们要求他满足所拥有的底数的同时,使得\((a+x)\)最小

因此我们需要枚举 \(c\)的所有因数,用\(fa[s],fb[s]\)分别表示在\(a,b\) 满足 状态 \(s\) 所包含所有底数时 最小的\(c\)的因数。

这里需要注意的是 状态\(s\)对于子状态 \(is\),也应该有
\(fa[is]=min(fa[is],fa[s])\),这样就可以求得最小的 在满足状态\(s\)后最小的\((a+x)\),最后 \(a+x+b+y\)的值即等于
\(min(fa[s]+fb[ ((1<<n)-1) \bigoplus s ])\),最后减去 \(a+b\)即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include <unordered_map>
#include<vector>
#include<set>
#include<cmath>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rpe(i,a,b) for(int i=a;i>=b;--i)
#define pts putchar('\n')
#define ptc putchar(' ')
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 lll;
typedef pair<int,int>P;
const int inf=0x7f7f7f7f;
const ll linf=1e18;
const int maxn=5e2+9;
const int maxm=3e5+9;
const double PI=3.1415926;
const double eps=1e-5;
const ll mod=1e9+7;
const int base=131;
const int N=1e6;



namespace IO{
    lll read(){	
		lll a=1,b=0;char c=getchar();
		while(c>'9'||c<'0'){if(c=='-')a=-1;c=getchar();} 
		while(c>='0'&&c<='9'){b=(b<<3)+(b<<1)+c-'0';c=getchar();}
		return a*b ;
	}
	void print (lll x){
		if(x<0) putchar('-'),x=-x;
		if(x>9) print(x/10);
		putchar(x%10+'0');
	} 
}
using namespace IO;

int n;

lll a,b,c;
lll p[20];
int q[20];

lll fa[maxn],fb[maxn];

void dfs(int now,lll sum,int s){
    if(now==n){
        if(sum>=a) fa[s]=min(fa[s],sum);
        if(sum>=b) fb[s]=min(fb[s],sum);
        return;
    }
    rep(i,0,q[now]){
        if(i==q[now]) s|=(1<<now);
        dfs(now+1,sum,s);
        sum*=p[now];
    }
}

int main(){
	freopen("in0.txt","r",stdin);
//	freopen("3.out","w",stdout);
	n=read();int m=(1<<n)-1;
	rep(i,0,n-1) p[i]=read(),q[i]=read();
    a=read(),b=read();
    c=1;
    rep(i,0,n-1){
        rep(j,1,q[i]) c*=p[i];
    }
    lll ans=c+c;
    rep(i,0,m) fa[i]=fb[i]=ans;
    dfs(0,1,0);
    rpe(i,m,0){
        rep(j,0,n-1){
            if((i&(1<<j))){
                fa[i^(1<<j)]=min(fa[i^(1<<j)],fa[i]);
                fb[i^(1<<j)]=min(fb[i^(1<<j)],fb[i]);
            }
        }
    }
    rep(i,0,m) ans=min(ans,fa[i]+fb[m^i]);
    print(ans-a-b);
    return 0;
}

标签:const,Greater,int,多校,Better,fa,fb,lll,include
来源: https://www.cnblogs.com/Mr-leng/p/15087221.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有