P8782 [蓝桥杯 2022 省 B] X 进制减法 题解
UPDATE
2023.2.21 添加了第一位读者 @Palpitate23 的问题并解答
2023.3.13 添加了第二位读者 @abc1352758620 的问题并解答
2023.4.4 修了公式中不完善的地方。
question & answer
Q : 为什么计算
A : 是这样的,因为两个数
问题来自:@Palpitate23
Q :如果某一位的数字,出现
A :思考的很全面,因为题面中提到了
借位其实就是直接取模后减法,即使答案是一个负数,但是在取模意义下的结果,所以我们直接进行取模意义下的减法即可。
另外,其实题目中保证了
问题来自:@abc1352758620
在此由衷感谢!
题意简述
这题其实非常好理解,只是有一点点要注意。
平常的
但在此题中,由于进制不同,无法以上方式子得到权值,第i位的权值是
题目分析
对于每一位,
最后直接上代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100010];
int b[100010];
int c[100010];
int d[100010];
const int mod=1e9+7;
signed main()
{
int n; //输入部分
cin>>n;
int ma;
cin>>ma;
for(int i=ma;i;i--)
cin>>a[i];
int mb;
cin>>mb;
for(int i=mb;i;i--)
cin>>b[i];
for(int i=max(ma,mb);i;i--) //处理进制
c[i]=max(a[i],b[i])+1;
for(int i=max(ma,mb);i;i--) //最低进制是二进制
c[i]=c[i]>2?c[i]:2;
d[1]=1; //处理每一位的价值
for(int i=2;i<=max(ma,mb);i++)
d[i]=(d[i-1]*c[i-1])%mod;
long long ka=0,kb=0; //统计价值
for(int i=ma;i;i--)
ka+=a[i]*d[i],ka%=mod;
for(int i=mb;i;i--)
kb+=b[i]*d[i],kb%=mod;
cout<<(ka-kb+mod)%mod; //特别注意:模意义下的减法
return 0;
}
思考提升
如果题目要求每一位的进制互不相同呢?
提示:考虑求每一位权值的式子。
结论:还是贪心,让低位的进制尽可能的小,以此保证后面的权值尽可能的小。