R = B^P mod M
LL m;
LL big_mod(LL n, LL p)
{
if(p==0) return 1;
if(!(p&1))
{
LL r = big_mod(n,p/2) % m;
return ( (r%m) * (r%m) ) % m;
}
else
{
return ( ( n%m) * (big_mod(n,p-1) %m)) % m;
}
}
int main()
{
LL b,p;
while(~sf("%lld %lld %lld",&b,&p,&m))
{
pf("%lld\n",big_mod(b,p));
}
return 0;
}
পাওয়ার বা P যদি জোড় হয় তবে LL r = big_mod(n,p/2) % m; এই লাইন ইউস করা হইসে । এবং পরে একে অপরের সাথে গুন করা হইসে ।তবে মনে রাখতে হবে মোড কিন্তু প্রত্যক অপারেশনের সাথে করতে হবে ।। পাওয়ার যদি বেজোড় হয় তাহলে n এর মোডের সাথে P-1 গুন করে দিতে হবে । কারন 2^25 = 2 * 2^24 ;
আর হ্যাঁ , অবশ্যই প্রত্যেকের সাথে m mod করতে হবে ।।
********* আমরা যে নাম্বার দিয়ে কোন নাম্বার কে ভাগ করি তাকে বলি ভাজক, যে নাম্বারকে ভাগ করা হচ্ছে তাকে বলে ভাজ্য , ভাগ করে আমরা যে রেজাল্ট পাই তাকে বলে ভাগফল, আর যা অবশিষ্ট থাকে তাকে বলে ভাগশেষ । আমরা মোড করে কেবল ভাগশেষ পাই ।।
**** তো মোড করলে একটা লাভ হয় যে , আমরা বিশাল বড় একটা রেজাল্টকে অনেক ছোট করে ফেলতে পারি ।। এবং মনে রাখতে হবে "" কোন ভাগশেষ কখনও ভাজ্য থেকে বড় হতে পারে না । ""
আরেকটু ভাল ভাবে বললে, ভাগশেষ < ভাজ্য , মানে কোনো সংখ্যাকে m দিয়ে mod করা হলে সংখ্যাটি m এর থেকে বড় হতে পারবেনা।
