Che cos'è esattamente "stamparlo modulo 10^9 + 7" nei siti web di programmazione competitiva?
Nella maggior parte delle competizioni di programmazione, ci viene richiesto di rispondere al risultato in 10^9+7 modulo. La ragione dietro questo è, se i vincoli del problema sono grandi numeri interi, solo algoritmi efficienti possono risolverli in tempo limitato consentito.
Che cosa è l'operazione modulo:
Il resto ottenuto dopo l'operazione di divisione su due operandi è noto come operazione modulo. L'operatore per fare l'operazione modulo è '%'. Per esempio: a % b = c che significa, quando a è diviso per b dà il resto c, 7%2 = 1, 17%3 = 2.
Perché abbiamo bisogno del modulo:
- La ragione di prendere Mod è di prevenire gli overflow interi. Il più grande tipo di dati interi in C/C++ è unsigned long long int che è di 64 bit e può gestire interi da 0 a (2^64 - 1). Ma in alcuni problemi in cui il tasso di crescita dell'output è molto alto, questo alto intervallo di unsigned long long può essere insufficiente.
Supponiamo che in una variabile a 64 bit 'A', sia memorizzato 2^62 e in un'altra variabile a 64 bit 'B', sia memorizzato 2^63. Quando moltiplichiamo A e B, il sistema non dà un errore di runtime o un'eccezione. Fa solo qualche calcolo fasullo e memorizza il risultato fasullo perché la dimensione del bit del risultato viene dopo la moltiplicazione è troppo grande. - In alcuni problemi, per calcolare il risultato è necessario il modulo inverso e questo numero aiuta molto perché è primo. Anche questo numero dovrebbe essere abbastanza grande altrimenti le tecniche di inversione modulare potrebbero fallire in alcune situazioni.
A causa di queste ragioni, gli impostatori di problemi richiedono di dare la risposta come risultato del modulo di un certo numero N.
Ci sono alcuni criteri da cui dipende il valore di N:
- Dovrebbe essere abbastanza grande da rientrare nel più grande tipo di dati interi i.e fa in modo che non ci sia un overflow nel risultato.
- Dovrebbe essere un numero primo perché se prendiamo mod di un numero per primo il risultato è generalmente distanziato cioè i risultati sono molto diversi rispetto a mod il numero per non primo, ecco perché i primi sono generalmente usati per mod.
10^9+7 soddisfa entrambi i criteri. È il primo numero primo a 10 cifre e si adatta anche al tipo di dati int. Infatti, qualsiasi numero primo inferiore a 2^30 va bene per prevenire possibili overflow.
Come viene usato il modulo:
Alcune proprietà distributive del modulo sono le seguenti:
- ( a + b) % c = ( ( a % c ) + ( b % c ) ) % c
- ( a * b) % c = ( ( a % c ) * ( b % c ) ) % c
- ( a - b) % c = ( ( a % c ) - ( b % c ) ) % c
- ( a / b ) % c = ( ( a % c ) / ( b % c ) ) % c
Quindi, modulo è distributivo su +, * e - ma non su / [Si prega di fare riferimento alla Divisione Modulare per i dettagli]
NOTA: Il risultato di ( a % b ) sarà sempre minore di b.
In the case of computer programs, due to the size of variable limitations, we perform modulo M at each intermediate stage so that range overflow never occurs.
- Example:
- a = 145785635595363569532135132
- b = 3151635135413512165131321321
- c = 999874455222222200651351351
- m = 1000000007
- Print (a*b*c)%m.
- Method 1:
- First, multiply all the number and then take modulo:
- (a*b*c)%m = (459405448184212290893339835148809
- 515332440033400818566717735644307024625348601572) %
- 1000000007
- a*b*c does not fit even in the unsigned long long
- int due to which system drop some of its most
- significant digits. Therefore, it gives the wrong answer.
- (a*b*c)%m = 798848767
- Method 2:
- Take modulo at each intermediate steps:
- i = 1
- i = (i*a) % m // i = 508086243
- i = (i*b) % m // i = 144702857
- i = (i*c) % m // i = 798848767
- i = 798848767
- Method 2 always gives the correct answer.
Articoli simili
- In che modo la programmazione competitiva è diversa da quella della vita reale?
- Come posso iniziare con la programmazione competitiva?
- Quali strutture di dati e algoritmi di base si dovrebbero imparare prima di iniziare la programmazione competitiva?
- Come si può entrare nella scena competitiva dei Pokemon?