1つの整数の行を出力します。これは、10進数に変換されてから1e9+7を法とするX基数ABの結果の可能な最小値を表します。
分析、これは実際には貪欲な問題です。まず、各数値の重みを決定するものを見てみましょう。質問で与えられた数値を見てみましょう。321と3が配置されているビットは8進数です。2が配置されている桁は10進数です。 、および1が配置されている桁は2進数です。明らかに、下位2桁ごとに2桁目に入力でき、10秒ごとに1桁目に、つまり2*103分の1ごとに入力できることがわかります。ビットは最初のビットに入ることができます。i番目のビットの重みは、実際にはi番目のビットよりも低いビットの底の積であることがわかります。2進数と10進数も理解しやすいので、わかりません。これについてもっと言う
AがBよりも大きいことはすでにわかっているので、ABをできるだけ小さくするには、高レベルの重みをできるだけ小さくし、低レベルの重みの影響を無視できるようにする必要があります。なぜですか。高い位置の重みが1減少すると、すべての低い位置の合計よりも大きな影響があるため、貪欲な戦略は高い位置の重みを減らすことです。重み、低い位置が上にあるとき、各桁のベースが最小になると、各桁が2つの数値aとbを与えるため、この時点で高い位置の重みが最小になることがわかります。基数はa以下またはb以下にすることはできないため、ビットの基数をaおよびbの最大値に1を加えた値にするだけで済みます。
コードは次のとおりです。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
long long a[N],b[N];
int main()
{
int n,lena,lenb;
scanf("%d%d",&n,&lena);
for(int i=lena;i>=1;i--)
scanf("%lld",&a[i]);
scanf("%d",&lenb);
for(int i=lenb;i>=1;i--)
scanf("%lld",&b[i]);
long long ans=0,mul=1;
for(int i=1;i<=lena;i++)
{
ans=(ans+(a[i]-b[i])*mul)%mod;
long long t=max(a[i],b[i])+1;
if(t<2) t=2;
mul=mul*t%mod;
}
printf("%lld",ans);
return 0;
}