c++ - 你为什么要将 10^9+7 加到一个数字上,然后用 10^9+7 求模

标签 c++ math modulo long-long fenwick-tree

我正在解决一个名为 shill 和 wave sequence 的 Fenwick 树问题,它没有通过所有测试用例,直到我添加了一行查看解决方案,现在想找到它的目的,这是我的代码

#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
long long query(long long index,int p,long long **bit)
{
    long long count=0;
    for(;index>0;index-=(index&(-index)))
    {
        count=(count+bit[index][p])%mod;
    }
    return count;
}
void update(long long **bit,long long index,int p,long long val)
{
    for(;index<=100000;index+=(index&(-index)))
    {
        bit[index][p]=(bit[index][p]+val)%mod;
    }
}

int main()
{
    int n;
    cin>>n;
    long long ans=0;
    long long **bit=new long long*[100000+1];
    for(int i=1;i<=100000;i++)
    {
        bit[i]=new long long[3];
        for(int j=0;j<3;j++)
        {
            bit[i][j]=0;
        }
    }
    for(int i=0;i<n;i++)
    {
        long long x;
        cin>>x;
        long long a=(query(x-1,0,bit)+query(x-1,2,bit))%mod;
        long long b=(query(100000,1,bit)+query(100000,2,bit))%mod-query(x,1,bit)-query(x,2,bit);
        b=(b+mod)%mod;
//WHAT IS THE PURPOSE OF ABOVE LINE?
        ans+=(a+b)%mod;
        update(bit,x,0,b);
        update(bit,x,1,a);
        update(bit,x,2,1);
    }
    cout<<ans%mod;
    return 0;
} 

b=(b+mod)%mod 但是为什么?

最佳答案

在某些情况下,b 可能是负数,直接执行 % 可能会导致不正确的结果。这就是为什么在执行 % 操作之前,添加 mod 是安全的,然后执行 % 这将使数字首先为正,然后再执行模数。

关于c++ - 你为什么要将 10^9+7 加到一个数字上,然后用 10^9+7 求模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69009291/

相关文章:

java - 在 Java 中使用 Math.pow 确定立方体的表面积,并且 'skipping' 也有困难

c++ - 返回模的解释

c++ - FatFS - 我可以创建多个搜索位置吗?

c++ - 如何从进程中获取实时、非阻塞的输出

android - Android 线性代数库

javascript - 如何为pdfmake表格中的每两行着色

c++ - 获取数字小数部分的最佳方法

c# - C++加密,C#解密=失败

c++ - 如何在 C++ 中获取 Windows 中的设备属性?

php - mysql显示所有行的计算平均值