2016-02-05 1 views
1

je calcule la somme suivante:Triple Modular Multiplicaiton

(a [x] + m a [x-1] + 2m A [X-2] + 3m * a [x-3] + ....)% MOD (MOD = 1e9 + 7)

Pour cela, j'utilise cette boucle.

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; 

Cependant, cela me donne toujours des erreurs de débordement. L'erreur de base, je suppose est dans (b c)% MOD.

Merci.

+0

Qu'est-ce que vous essayez vraiment trouver? '1e9 + 7' ressemble à un problème de concours (Project Euler, peut-être), et ceux-ci ont généralement une manière sournoise de revenir dans la réponse. La réponse facile, cependant, est d'utiliser la version de BigInteger de votre langue. – Teepeemm

+0

Long long int ne peut pas contenir quelque chose de l'ordre de la multiplication de 3 nombres vraiment grands. J'ai donc besoin de créer une fonction qui le calcule. – someone1

+0

mulmod ne fonctionne pas correctement si l'un des arguments est négatif. Ni 'res = a [x]% MOD non plus. Êtes-vous sûr que tous les a [i] sont> = 0 –

Répondre

0

Vous devez intégrer les identités arithmétiques modulaires suivantes dans votre programme pour éviter tout débordement:

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

et

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

+0

'pour (i = x-1; i> = 1; i -)' \t 'res = (res% MOD + (((xi)% MOD) * (m% MOD) * (a [i]% MOD))% MOD)% MOD; ' J'ai changé mon code pour cela, mais l'erreur est toujours présente. – someone1

+0

Ces lignes: 'return (a2 + a2)% c;' et 'return ((a% c) + (a2 + a2))% c;' ont également un potentiel de débordement. –

+0

Si j'utilise directement la propriété de multiplication utilisée ci-dessus et remplacez la fonction par cette ligne: 'res = (res% MOD + (((xi)% MOD) * (m% MOD) * (a [i]% MOD))% MOD)% MOD; ' Cela ne devrait-il pas fonctionner? – someone1