X 进制减法
问题描述
进制规定了数字在数位上逢几进一。
XX 进制是一种很神奇的进制, 因为其每一数位的进制并不固定!例如说某 种 XX 进制数, 最低数位为二进制, 第二数位为十进制, 第三数位为八进制, 则 XX 进制数 321 转换为十进制数为 65 。
现在有两个 XX 进制表示的整数 AA 和 BB, 但是其具体每一数位的进制还不确 定, 只知道 AA 和 BB 是同一进制规则, 且每一数位最高为 NN 进制, 最低为二进 制。请你算出 A−BA−B 的结果最小可能是多少。
请注意, 你需要保证 AA 和 BB 在 XX 进制下都是合法的, 即每一数位上的数 字要小于其进制。
输入格式
第一行一个正整数 NN, 含义如题面所述。
第二行一个正整数 MaMa, 表示 XX 进制数 AA 的位数。
第三行 MaMa 个用空格分开的整数, 表示 XX 进制数 AA 按从高位到低位顺序各 个数位上的数字在十进制下的表示。
第四行一个正整数 MbMb, 表示 XX 进制数 BB 的位数。
第五行 MbMb 个用空格分开的整数, 表示 XX 进制数 BB 按从高位到低位顺序各 个数位上的数字在十进制下的表示。
请注意, 输入中的所有数字都是十进制的。
输出格式
输出一行一个整数, 表示 XX 进制数 A−BA−B 的结果的最小可能值转换为十进 制后再模 1000000007 的结果。
样例输入
11
3
10 4 0
3
1 2 0
样例输出
94
样例说明
当进制为: 最低位 2 进制, 第二数位 5 进制, 第三数位 11 进制时, 减法 得到的差最小。此时 AA 在十进制下是 108,B108,B 在十进制下是 14 , 差值是 94。
评测用例规模与约定
对于 30%30% 的数据, N≤10;Ma,Mb≤8N≤10;Ma,Mb≤8.
对于 100%100% 的数据, 2≤N≤1000;1≤Ma,Mb≤100000;A≥B2≤N≤1000;1≤Ma,Mb≤100000;A≥B.
#include <bits/stdc++.h>
using namespace std;
const int M = 100010, N = 1010, mod = 1000000007;
typedef long long LL;
LL a[M], b[M], w[M]; // a[] 存储A各位数字 b[] 存储B各位数字 w[] 存储各位的进制
int n;
int Ma, Mb;
LL mul[M]; // 各位数字的实际权重
LL A, B;
int main(){
cin >> n; // 最大进制
cin >> Ma;
for(int i = Ma; i >= 1; i --) cin >> a[i];
cin >> Mb;
for(int i = Mb; i >= 1; i --) cin >> b[i];
// 确定各位进制 w[i]
int MM = max(Ma, Mb); // A B 中最大的位数
for(int i = MM;i >= 1; i --){
int tmax = max(a[i], b[i]);
w[i] = max(2, tmax + 1);
}
// 计算权重
mul[1] = 1;
for(int i = 2; i <= MM;i ++){
mul[i] = w[i - 1] * mul[i - 1] % mod;
}
// 计算A
for(int i = Ma; i >= 1; i --){
A = (A + a[i] * mul[i]) % mod;
}
// 计算B
for(int i = Mb; i >= 1; i --){
B = (B + b[i] * mul[i]) % mod;
}
// A - B
cout << (A - B + mod) % mod << endl;
return 0;
}