Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中带负数的模+;_C++_Modulo_Recurrence - Fatal编程技术网

C++ C+中带负数的模+;

C++ C+中带负数的模+;,c++,modulo,recurrence,C++,Modulo,Recurrence,我一直在为以下递归关系编写程序: An = 5An-1 - 2An-2 - An-3 + An-4 输出应为答案模数10^9+7。。 我为这篇文章写了一个蛮力方法如下 long long int t1=5, t2=9, t3=11, t4=13, sum; while(i--) { sum=((5*t4) - 2*t3 - t2 +t1)%MOD; t1=t2; t2=t3; t3=t4; t4=sum; } printf("%lld\n", sum)

我一直在为以下递归关系编写程序:

An = 5An-1 - 2An-2  - An-3 + An-4
输出应为答案模数10^9+7。。 我为这篇文章写了一个蛮力方法如下

long long int t1=5, t2=9, t3=11, t4=13, sum;
while(i--)
{
    sum=((5*t4) - 2*t3 - t2 +t1)%MOD;
    t1=t2;
    t2=t3;
    t3=t4;
    t4=sum;
}
printf("%lld\n", sum);
其中
MOD=10^9+7
一切似乎都是真的。。但我得到了一些价值观的否定答案。。由于这个问题,我无法找到正确的解决方案。。。
Plz帮助找到保持模数的正确位置,只需将模数替换为处理负值的函数即可:

long long int mod(long long int a, long long int b) {
    long long int ret = a % b;
    if (ret < 0)
        ret += b;
    return ret;
}
long-long-int-mod(long-long-int-a,long-long-int-b){
long-long-int-ret=a%b;
如果(ret<0)
ret+=b;
返回ret;
}

编辑:将数据类型更改为
long-long-int

问题是%运算符不是“模运算符”,而是具有以下等式的“除余数”运算符

(a/b)*b + a%b == a    (for b!=0)
所以,如果您的整数除法舍入为零(我认为这是自C99和C++11以来的强制要求),-5/4将是-1,我们得到了

(-5/4)*4 + -5%4 == -5
  -1  *4    -1  == -5
为了得到正结果(对于模运算),需要在余数为负的情况下添加除数,或者执行以下操作:

long mod(long a, long b)
{ return (a%b+b)%b; }

正如其他人所说,
%
只是一个余数运算符,而不是
mod
。但是,mod/rements操作通过这样的递归关系正确分布,所以如果您只是将最终解调整为正,就像这样

if (sum < 0) { sum = sum + MOD; }
if(sum<0){sum=sum+MOD;}

那么你应该得到正确的答案。这样做的好处是每次循环迭代只引入一个函数调用和/或分支。(这可能重要,也可能不重要,这取决于你的编译器有多聪明)。

当abs(a)>b时,这里所有公式中有一次性加法的答案都是错误的。使用以下或类似的方法:

int modulo (int a, int b) { return a >= 0 ? a % b : ( b - abs ( a%b ) ) % b; }

在@sellibitze和@liquidblueocean的答案中第二次使用
%
可能不会像
%
一般情况下那样慢,因为它归结为
b
的一个减法或无减法。事实上,让我检查一下

int main(int argc, char **argv) {
    int a = argc;    //Various tricks to prevent the
    int b = 7;       //compiler from optimising things out.
    int c[10];       //Using g++ 4.8.1
    for (int i = 0; i < 1000111000; ++i)
        c[a % b] = 3;
        //c[a < b ? a : a-b] = 3;
    return a;
}

这需要时间,但这几乎是不必要的。

你不应该对
求和使用
无符号long-long
吗?@Alex1985如果
%
运算符总是返回一个正值,这不会有任何区别,但是因为它有时会给出一个负值,所以应该使用有符号变量。@Hurkyl-你说得对。注释已删除。注意,如果使用模矩阵求幂而不是直接使用递归关系(即
O(N)
),则可以在
O(log(N))
时间内解决此问题。
int mod(int k, int n) {
    return ((k %= n) < 0) ? k+n : k;
}