【问题标题】:Why would you ever add 10^9+7 to a number and then take mod with 10^9+7你为什么要把 10^9+7 加到一个数字上,然后用 10^9+7 取模?
【发布时间】:2021-10-30 16:36:32
【问题描述】:

我正在解决一个名为 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 是否为负数可能有意义! % 不是取模运算符,而是取余运算符。
  • 我投票结束这个问题,因为它似乎基本上是一个数学和/或计算机科学问题,而不是一个编程问题。
  • @KarlKnechtel 这很明显与编程相关——特别是因为如果你把它当作一个纯数学问题,答案会不同
  • @KarlKnechtel 这是关于操作员% 的行为的问题。值得注意的是,a % b 在大多数编程语言中的不同之处在于,四种可能的符号组合(a 正,b 正),(a 负,b 正),(a 正,b 负),(a 负, b 负数)。因此,对于每种不同的编程语言,这个问题都会有不同的答案。如果这样的问题不适合stackoverflow,那我不知道会是什么问题。

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


【解决方案1】:

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

【讨论】:

  • 添加 mod 并不一定是肯定的答案吗?例如,如果 b 为 -5 且 mod 为 3,则添加 mod 使其为 -2。您仍然可能是正确的,这是意图(并且可能在这种特定情况下有效)。
  • b 永远不可能是-5 如果mod 是3。OP 每次都在做b = (b + mod) % mod。所以b的值不能是-5@user32149
【解决方案2】:

这条线的“目的”(或者更确切地说,它有任何影响的原因)可能是

b=(b+mod)%mod;

改变 b 的值。

所以剩下的问题是,在应用 %mod 之前添加“mod”是否重要?

数学上

(x+y) mod y = x mod y

但是,在许多编程语言中,int 都有一个最大值,如果加起来太大,就会出现整数溢出。 在这种情况下,很容易发生这种情况

(x+y) mod y != x mod y

这可能是你的情况。

【讨论】:

  • 不是这里的问题。 b 可以是负数。例如,-2 % 5 = -2(-2 + 5) % 5 = 3% 并不是真正的模运算符。
  • 很少有溢出是预期行为的情况。更别说用这种方式实现了。
  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多