2016-02-05 2 views
1

Я вычисления следующую сумму:Тройной Модульный Multiplicaiton

(а [х] + т а [х-1] + 2m а [х-2] + 3m * а [х-3] + ....)% MOD (MOD = 1e9 + 7)

Для этого я использую этот цикл.

long long mulmod(long long a,long long b,long long c) 
{ 
    if (a == 0 || b == 0) 
     return 0; 
    if (a == 1) 
     return b; 
    if (b == 1) 
     return a; 
    long long a2 = mulmod(a, b/2, c); 
    if ((b & 1) == 0) 
    { 
     return (a2 + a2) % c; 
    } 
    else 
    { 
     return ((a % c) + (a2 + a2)) % c; 
    } 
} 

res=a[x]%MOD; 
for(i=x-1;i>=1;i--) 
    res=(res%MOD+mulmod(mulmod(x-i,m,MOD),a[i],MOD))%MOD; 

Однако, это все еще дает мне ошибки переполнения. Основная ошибка, я думаю, находится в (a b c)% MOD.

спасибо.

+0

Что вы на самом деле пытаетесь найти? '1e9 + 7' выглядит как проблема конкурса (Project Euler, возможно), и у них обычно есть подлый способ вернуться в ответ. Тем не менее, легкий ответ заключается в использовании версии BigInteger на вашем языке. – Teepeemm

+0

Длинный длинный int не может вписаться в что-то вроде порядка умножения 3 действительно больших чисел. Поэтому мне нужно создать функцию, которая его вычисляет. – someone1

+0

mulmod не работает правильно, если какой-либо из аргументов отрицательный. Также 'res = a [x]% MOD'. Вы уверены, что все a [i] равны> 0 –

ответ

0

Вам необходимо включить следующие модульные арифметические тождества в программу, чтобы избежать переполнения:

(A + B + ...) mod C = (A mod C + B mod C + ... mod C) mod C

и

(A * B * ...) mod C = (A mod C * B mod C * ... mod C) mod C

+0

'для (i = x-1; i> = 1; i -)' \t 'res = (res% MOD + (((xi)% MOD) * (m% MOD) * (a [i]% MOD))% MOD)% MOD; ' Я поменял свой код на это, однако ошибка все еще присутствует. – someone1

+0

Эти строки: 'return (a2 + a2)% c;' и 'return ((a% c) + (a2 + a2))% c;' также имеют потенциал переполнения. –

+0

Если я непосредственно использую используемое выше свойство умножения и заменяю функцию на эту одну строку: 'res = (res% MOD + (((xi)% MOD) * (m% MOD) * (a [i]% MOD))% MOD)% MOD; ' Не должно ли это работать? – someone1

Смежные вопросы