传送门
题目大意
code
#include<bits/stdc++.h>
using namespace std;
#define ll __int128
ll fa[1<<18],fb[1<<18];
int p[20],q[20];
ll a,b;
int n;
ll read()
{
ll sum=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
sum=(sum<<3)+(sum<<1)+c-'0';
c=getchar();
}
return sum;
}
void dfs(int d,int s,ll aa)
{
if(d>n)
{
if(aa>=a)
{
if(!fa[s]) fa[s]=aa;
else fa[s]=min(fa[s],aa);
}
if(aa>=b)
{
if(!fa[s]) fa[s]=aa;
else fb[s]=min(fb[s],aa);
}
return;
}
dfs(d+1,s,aa);
int i;
for(i=1;i<=q[d];i++)
{
aa*=p[d];
if(i==q[d]) s|=(1<<(d-1));
dfs(d+1,s,aa);
}
}
void aaa(ll x)
{
if (x/10==0)
{
printf("%d",(int)(x%10));
return;
}
aaa(x/10);
printf("%d",(int)(x%10));
}
int main()
{
int i,j,u;
cin>>n;
u=(1<<n)-1;
for(i=1;i<=n;i++)
cin>>p[i]>>q[i];
a=read();
b=read();
ll ans=1;
for(i=1;i<=36;i++)
ans*=10;
for(i=0;i<=u;i++)
fa[i]=fb[i]=ans;
dfs(1,0,1);
for(i=u;i>=0;i--)
for(j=0;j<n;j++)
{
fa[i]=min(fa[i],fa[i|(1<<j)]);
fb[i]=min(fb[i],fb[i|(1<<j)]);
}
for(i=0;i<u;i++)
ans=min(ans,fa[i]+fb[u^i]);
aaa(ans-a-b);
return 0;
}