写这个是为了记录一下思路(以及祭奠一下我的300块):
ps:321转化为65的来源:3*10*2+2*2+1=65;//这似乎就是进制转换的原理
证明很麻烦,这里我就引一位大佬的博客,他写了证明:2022年蓝桥杯软件类省赛 C/C++ B组 解析 - StelaYuri - 博客园 (cnblogs.com)
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,a[100005]={0},b[100005]={0},c[100005]={0};//a[]、b[]存整数A、B的各位数,c[]存各位数的进制
int i,j,k,len,sa,sb,sum=0;
cin>>n;//读入最大进制
cin>>j;//A的位数
for(i=j;i>0;i--)//要倒着读,可以避开A、B位数不相等的麻烦
cin>>a[i];
cin>>k;
for(i=k;i>0;i--)
cin>>b[i];
len=max(j,k);//记录最大长度位数 ,j、k已经不需要保留了
c[0]=1;//c[0]也是要用到的,如n^0=1;
for(i=1;i<=len;i++)
{
sa=a[i];sb=b[i];//sa记录a中该位的值,sb记录b中该位的值
c[i]=max(a[i],b[i])+1;//c[i]为该位的进制
if(c[i]<2) c[i]=2;//最低进制为2
for(j=i-1;j>=0;j--)//计算sa、sb
{
sa*=c[j];
sb*=c[j];
}
sum+=sa-sb;//计算差
}
cout<<sum%1000000007<<endl;//注意取模
}