X 进制减法问题

2023-12-21 07:34:46

?

思路如下:

代码如下:

#include<iostream>
using namespace std;
const int N = 1e5 + 5;
const long long MOD = 1000000007;
//定义了常量 N 和 MOD。N 是数组的最大长度,MOD 是取模运算的模数。

int numsA[N], numsB[N];
//声明了两个数组 numsA 和 numsB,用于存储多项式的系数。

//读入输入数据。
int main() {

    int maxN, m, n;
//读入 maxN 和 m,表示 numsA 数组的长度和非零项的数量。
    cin >> maxN >> m;
    for (int i = m - 1; i >= 0; i--) cin >> numsA[i];

    cin >> n;
//倒序读入 numsA 数组的系数。再读入 n,表示 numsB 数组的长度,并倒序读入 numsB 数组的系数。
    for (int j = n - 1; j >= 0; j--) cin >> numsB[j];

//求解多项式差的过程。
    long long ret = 0, base = 1;
//设置变量 ret 和 base,初始值都为 0 和 1,用于累加差值和计算权重的乘积。
    int weight;
    for (int i = 0; i < max(m, n); i++) {
        weight = max(max(numsA[i], numsB[i]) + 1, 2);
//遍历 numsA 和 numsB 数组中的每一项。对于每一项,计算权重为当前项的系数加 1 和 2 中的较大值,
//并将其存储在 weight 变量中。
// 多项式相加取模是符合分配律的,见公式
// 这里会频繁出现越界的情况

//计算差值的部分。
        ret = (ret+(numsA[i] - numsB[i]) * base)%MOD;
//用 (numsA[i] - numsB[i]) * base 计算差值,并使用取模操作保持结果在合理范围内。然后,将差值累加到 ret 变量中。
        base = (base*weight)%MOD;
//计算下一个项的权重的乘积,并使用取模操作保持结果在合理范围内。将计算得到的值存储在 base 变量中。
    }
    cout << ret % MOD;
//输出 ret % MOD,即多项式差的结果。
    return 0;
}

?????????该代码使用了取模操作,可以处理结果在整型范围内溢出的情况。同时,采用了倒序输入和遍历数组的方式,可以避免数组下标越界的问题。

????????加油各位!

文章来源:https://blog.csdn.net/Srlua/article/details/135120923
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。