进制规定了数字在数位上逢几进一。
X
进制是一种很神奇的进制,因为其每一数位的进制并不固定!
例如说某种 X
进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则 X
进制数 321
转换为十进制数为 65
。
现在有两个 X
进制表示的整数 A
和 B
,但是其具体每一数位的进制还不确定,只知道 A
和 B
是同一进制规则,且每一数位最高为 N
进制,最低为二进制。
请你算出 A−B
的结果最小可能是多少。
请注意,你需要保证 A
和 B
在 X
进制下都是合法的,即每一数位上的数字要小于其进制。
输入格式
第一行一个正整数 N
,含义如题面所述。
第二行一个正整数 Ma
,表示 X
进制数 A
的位数。
第三行 Ma
个用空格分开的整数,表示 X
进制数 A
按从高位到低位顺序各个数位上的数字在十进制下的表示。
第四行一个正整数 Mb
,表示 X
进制数 B
的位数。
第五行 Mb
个用空格分开的整数,表示 X
进制数 B
按从高位到低位顺序各个数位上的数字在十进制下的表示。
请注意,输入中的所有数字都是十进制的。
输出格式
输出一行一个整数,表示 X
进制数 A−B
的结果的最小可能值转换为十进制后再模 1000000007
的结果。
数据范围
对于 30%
的数据,N≤10;Ma,Mb≤8
,
对于 100%
的数据,2≤N≤1000;1≤Ma,Mb≤100000;A≥B
#include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
const int N = 100010;
const long long M = 1e9 + 7;
int ma[N], mb[N];
int main()
{
// 请在此输入您的代码
int n, x, y;
long long q = 1, sum = 0;
cin >> n;
cin >> x;
for(int i = x - 1; i >=0 ; i –) cin >> ma[i];
cin >> y;
for(int i = y - 1; i >= 0; i –) cin >> mb[i];
int mx = max(x, y);
for(int i = 0; i < mx; i ++)
{
sum = (sum + q * (ma[i] - mb[i])) % M;
// 为什莫改为使用下边这句话,就只能过 50%
// sum = (sum + (q * (ma[i] - mb[i])) % M ) % M;
int p = max(max(ma[i], mb[i]) + 1, 2);
q = (q * p) % M;
}
cout << sum % M << endl;
return 0;
}
为什莫将
sum = (sum + q * (ma[i] - mb[i])) % M;
改为
sum = (sum + (q * (ma[i] - mb[i])) % M ) % M;
在蓝桥系统就只能过 50%
有没有可能每次在内部模了m之后导致sum+后面的本身取模后不为0,模了两次变为0了,不过我觉得还是的看大数据具体判断
不太理解,不过还是谢谢