c++ silnia rekurencja modulo

0

Witam
Mam do napisania następujący program :
Zadanie jest następujące: należy policzyć n!! = [n (n - 2) (n - 4) ...] mod 225 - iloczyn wszystkich liczb tej samej parzystości co n (0 < n < 10000), brany modulo 2^25.
W pierwszej linii liczba k. W następnych k liniach pojedyncze liczby n.

Mój problem polega na tym, że program działa dla wszystkich liczb nieparzystych natomiast na liczb parzystych od pewnego momentu daje wynik 0. Dla np. 4 , 8 , 12 wynik jest poprawny ale już dla 70, 102 nie.

Mój kod:

#include <iostream>
using namespace std;
#include <math.h>
unsigned long long int silnia(int n ){
 
      //  if (n<0) return 0;
        if (n <= 2) return 1;
        
         return silnia(n-2)*n;
        }
 
int main(void){
       int  n,ile;
      int k= pow( 2 , 25 );
      cin>>ile;
    for (int j=0; j<ile;j++){
       cout << "Podaj n: ";
       cin >> n;
       cout << "wynik: " << (silnia(n))%k <<"\n";
       cout << "wynik: " << (silnia(n))<<"\n";
        }
        return 0;
}
 

Czy widzi ktoś gdzieś błąd?

0

a co w tym dziwnego? Powiedz mi ile jest 1234! modulo 10? I zastanów się nad wynikiem.
225=335*5

0

A ok to wiem. Ale mi się już problem zaczyna tu, że nawet wynik samej silni jest 0.

0

A kto ci każe liczyć silnie? Masz policzyć silnia modulo coś co wbrew pozorom jest łatwiejsze!
Silnie bardzo szybko rośnie, wiec zapewne przekraczasz zakres typu.

0

Nie przekraczam zakresu bo dla 70 nie działa a dla 71 działa. Wiem, że mam policzyć modulo, ale mimo wszystko w programie jest błąd.

0

70!!=3.550442606428591982435E+50 jak to mieścisz w long long int?
To że raz miałeś dobry wynik nie znaczy, że uzyskałeś go poprawnie.

0

Zakres unsigned long long int to : 18 446 744 073 709 551 615
71!!= 9 521 832 632 617 899 747

0

Mam humor więc spróbuj tego:

int podwojnaSilniaModulo(int n, int m) {
     result = 1;
     if (((n^m)&1)==0 && n>=m)
          return 0;
     while(n>1) {
        result = (result*n) % m;
        if (result==0)
             return 0;
        n-=2;
     }
     return result;
}

int podwojnaSilniaModulo225(int n) {
    if (n%2==1 && n>=15) 
        return 0;
    return podwojnaSilniaModulo(n, 225);
}
0

No dobra .. ale jakieś wskazówki jak to rozwiązać ?

interesuje mnie przypadek dla 10001 albo i jeszcze większych ... 99 999. .. jak z tym sobie poradzić ?

P.S. Modulo 2^25, nie 225

1 użytkowników online, w tym zalogowanych: 0, gości: 1