题意:给你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;
}