Թվի արագ աստիճան բարձրացում
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