X 进制减法
题目链接:
思路:
X进制数321怎么转换为十进制数为65?如下图:

①题目要求我们求 A - B 的最小值,对第 i 位,要求 A[i] - B[i] 的最小值,当进制越小的时候差值越小,但进制要比 max(A[i], B[i])大。题目有要求,最低为二进制,因此:进制 = max(max(A[i], B[i]), 2);
②由于数据比较大,所以我们进行一次计算,就取模 (1000000007)。
代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100010, MOD = 1000000007;
int n;
//存数字 A 、B
int a[N], b[N];
//答案
int ans;
signed main(){
cin >> n;
int m1; cin >> m1;
//将 A 位数字每一位逆序存入到数组a中
for(int i = m1-1; i >= 0; i--) cin >> a[i];
//将 B 位数字每一位逆序存入到数组b中
int m2; cin >> m2;
for(int i = m2-1; i>=0; i--) cin >>b[i];
//开始的进位为1
int d = 1;
//从数字的各位枚举到A,B数字中的最高位
for(int i = 0; i < max(m1, m2); i++){
//这一位差*前面进制
ans += (a[i]-b[i]) * d;
//取模,防止数据过大
ans %= MOD;
//更新最小的进制 最低为二进制
int w = max(max(a[i], b[i])+(long long)1, (long long)2) % MOD;
//更新最小的进制
d *= w;
//取模,防止数据过大
d %= MOD;
}
cout << ans%MOD << endl;
return 0;
}