Թվի արագ աստիճան բարձրացում
cmath
գրադարանիpow
ֆունկցիան շատ օգտակար է, բայց այն բավական դանդաղ է ու որոշ հաշվարկների համար հնարավոր չէ այն օգտագործել։ Եթե մենք պետք է հաշվենք
արտահայտության արժեքը և գիտենք, որ օրինակ a = 3
իսկ b = 64
, ապա շատ ավելի արագ ձև կա այս արտահայտությունը հաշվելու համեմատ 64 անգամ արդյունքը a
-ով բազմապատկելը։Ունենալով, որ
b
-ն 2-ի աստիճան է, խնդիրը շատ է հեշտանում։res = a; // res = 3 (3^1)
res = res * res; // res = 9 (3^2)
res = res * res; // res = 81 (3^4)
res = res * res; // res = 6561 (3^8)
res = res * res; // res = 43046721 (3^16)
res = res * res; // res = 1853020188851841 (3^32)
res = res * res; // res = 3433683820292512484657849089281 (3^64)
Այսպիսով մենք կատարեցինք միայն 6 բազմապատկման գործողություն, 64-ի փոխարեն և կարողացանք հաշվել
արտահայտության արժեքը։ Բնականաբար C++ի int
կամ long long
տիպերում այս թիվը չի տեղավորվի, այնպես որ եթե անգամ այսպիսի արժեք պետք գա, այն ամենայն հավանականությամբ պետք կգա ինչ-որ թվի վրա բաժանելուց ստացվող մնացորդ հաշվելուց հետո (որպեսզի C++ի ստանդարտ տիպերի մեջ տեղավորվի)։Անհրաժեշտ է գրել ֆունկցիա
long long binpow(int a, int b, int m)
որը արագ կհաշվի
արտահայտության արժեքը։Մուտքում տրված է երեք ամբողջ թիվ՝
a
, b
և m
-ը (1 ≤ a, m ≤ , 0 ≤ b ≤ )։ Գրեք binpow
անունով ֆունկցիա, որը կհաշվի
և ելքի միակ տողում տպեք այդ արտահայտության արժեքը։ Երաշխավորվում է որ b
-ն երկուսի աստիճան է։Մուտք | Ելք |
3 8 17 | 16 |
Constraints
Time limit: 0.2 seconds
Memory limit: 512 MB
Output limit: 1 MB