该题首先关键的一点是理解题意
即理解:X进制数321为什么等于十进制数65???(其中3的进制为八进制,2的进制为十进制,1的进制为2进制)
类比正常的进制数计算我们可以得到
65=3*8*2+2*2+1
即
明白了这一点其实就不难想到如何使得A-B最小
我们只需要在保证进制合法的情况下使得所有进制最小即可
据此就可以写出代码了
#include<iostream> #include<algorithm> #define MAX 100005 //#define int long long using namespace std; const int inf=1e9+7; int n,ma,mb,k; int a[MAX]; int b[MAX]; int base[MAX]; signed main(){ cin>>n; cin>>ma; for(int i=ma;i>=1;i--){ cin>>a[i]; } cin>>mb; for(int j=mb;j>=1;j--){ cin>>b[j]; } k=max(ma,mb); for(int i=1;i<=k;i++){ base[i]=max(2,max(a[i],b[i])+1); } long long A=0,B=0;//注意要long long for(int i=ma;i>=1;i--){ A=(A*base[i]+a[i])%inf;//注意取模 } for(int i=mb;i>=1;i--){ B=(B*base[i]+b[i])%inf; } long long ans=(A-B+inf)%inf;//因为可能出现负数所以先+inf cout<<ans<<endl; return 0; }