Vraag Heb je hulp nodig bij het aanvragen van mod 1000000007?


Ik ben zwak in wiskunde en blijf altijd vastzitten met de problemen die antwoord modulo vereisen.

bijvoorbeeld: (500! / 20!) mod 1000000007

Ik ben bekend met BigIntegers maar het berekenen van modulo na het berekenen van de factor van 500 (zelfs na het gebruik van DP) lijkt veel tijd in beslag te nemen.

Ik zou graag willen weten of er een bepaalde manier is om met dit soort problemen om te gaan of om met dit soort problemen om te gaan.

Dit is een probleem dat ik op dit moment probeer op te lossen: http://www.codechef.com/FEB12/problems/WCOUNT

Het zou echt handig zijn als iemand mij zou kunnen wijzen op een tutorial of aanpak om met deze codeerproblemen om te gaan. Ik ben bekend met Java en C ++.


26
2018-02-07 00:03


oorsprong


antwoorden:


De sleutel tot deze groot-aantal modulus-taken is niet om het volledige resultaat te berekenen voordat de modulus wordt uitgevoerd. U moet de modulus in de tussenstappen verlagen om het aantal klein te houden:

500! / 20! = 21 * 22 * 23 * ... * 500

21 * 22 * 23 * 24 * 25 * 26 * 27 = 4475671200

4475671200 mod 1000000007 = 475671172
475671172 * 28 mod 1000000007 = 318792725
318792725 * 29 mod 1000000007 = 244988962
244988962 * 30 mod 1000000007 = 349668811

...

 31768431 * 500 mod 1000000007 = 884215395

500! / 20! mod 1000000007 = 884215395

U hoeft de modulus niet bij elke stap te verlagen. Doe het vaak genoeg om te voorkomen dat het nummer te groot wordt.


Merk op dat de maximale waarde van long is 2 ^ 63 - 1. Dus het uitvoeren van 64 bit-vermenigvuldigingen tussen twee positieve gehele getallen (dat wil zeggen, één van de operanden is a long) zal niet overlopen long. U kunt de restbewerking veilig uitvoeren % achteraf (als dat ook positief is) en teruggegooid naar een geheel getal wanneer dat nodig is.


49
2018-02-07 00:09



Begin door dat te observeren 500!/20! is het product van alle nummers van 21 tot 500, inclusief en Volgende, merk op dat je modulo-vermenigvuldiging per item kunt uitvoeren, %1000000007 aan het einde van elke operatie. Je zou nu je programma moeten kunnen schrijven. Pas op dat het nummer niet overloopt: 32 bits is misschien niet genoeg.


7
2018-02-07 00:10



Ik denk dat dit iets voor jou kan zijn

for(mod=prime,res=1,i=20;i<501;i++)
{
res*=i; // an obvious step to be done 
if(res>mod) // check if the number exceeds mod
res%=mod; // so as to avoid the modulo as it is costly operation 
}

5
2018-03-22 10:22