Tuesday, July 11, 2017

ATOMS - Atoms in the Lab SPOJ Problem Solution & Logic

http://www.spoj.com/problems/ATOMS/

খুবই সহজ একটি প্রোবলেম , তোমায় বলা আছে যে - একটা  Atomic Research Centre - এ N সংখ্যক
 Atom আছে , যেটা ১ সেকেন্ড পর পর  K সংখ্যক টুকরোতে পরিনত হয় । এখন , লক্ষ রাখতে হবে , মোট Atom এর টুকরোর পরিমাণ যেনো , M ছাড়িয়ে না যায় । তাহলে , টুকরোর পরিমাণ ১ সেকেন্ড পর পর গুণ করে বাড়তে থাকবে , যে পর্যন্ত না  ছাড়িয়ে যায় । তারপর , কয় সেকেন্ড লাগলো ??
 সেটাই হবে , আমাদের উত্তর ।

কিন্তু , সমস্যা হলো - K ,N, M এর মান অনেক বেশী বড়ো রেঞ্জ এর হবে

         K ,N, M <= 10^18 

সেই জন্য , আমাদের  N=N*K করে , বাড়িয়ে অবদি চেক করার চেয়ে ,

S=1 ,  ধরে -  S=S*K;  করে , বাড়িয়ে M/N  অবদি চেক করতে হবে - তাহলে , কিন্তু একই কাজই করা হবে এবং Overflow হবে না ।  কারণ, S=S*K করে বাড়ানোর কারনে , গুনফল আগের পদ্ধতি N=N*K
করে বাড়ালে , যে গুনফল হতো - তার চেয়ে N গুণ কম হবে । আর , সেই জন্যই  আমাদের লিমিটেশনও
কে  দিয়ে ভাগ দিয়ে  কমিয়ে   M/N  করে নিয়েছি । ঘুরেফিরে , একই কাজ করেছি - যেনো , মেমোরি'তে Overflow না হয় । চলো , কোড দেখি -------

#include<iostream>
#include<cstdio>

using namespace std;

int main()

{

    int p;

    scanf("%d",&p);

    while(p--)

    {

        unsigned long long int n,k,m,s=1,t=0;

        scanf("%llu%llu%llu",&n,&k,&m);

        if(n>m)

            printf("0\n");

        else

        {

            while(s<=m/n)

            {

                s=s*k;

                if(s<=m/n)

                  {

                    t++;

                   }

            }

            printf("%llu\n",t);

        }

    }

    return 0;

}





 



No comments:

Post a Comment