421. ইয়ো-ইয়ো

 

ইয়ো-ইয়ো খেলনাটিতে দুটো চাকতি একটা ছোট্ট রড দিয়ে যুক্ত থাকে, যে রডে সুতো প্যাঁচানো থাকে। যদি সূতোটার একপ্রান্তে ধরে প্যাঁচানো কুন্ডলীটা ছেড়ে দেওয়া হয়, ইয়ো-ইয়োটা ঘুরতে ঘুরতে প্রথমে নিচে নামবে, তারপর জড়তার কারণে আবার উপরে উঠতে থাকবে। কিন্তু যতখানি উপরে উঠবে, তা হবে যতখানি নিচে নেমেছিল তার k ভাগ আমরা ধরে নিতে পারি যে, এভাবে চলতে চলতে যদি কখনো 1 এর কম দৈর্ঘ্য উপরে উঠে, তাহলে ইয়ো-ইয়োটা থেমে যাবে।

 

এমন একটা প্রোগ্রাম লিখতে হবে যেটা l দৈর্ঘ্যের সূতা আর কোন k এর মানের জন্যে থেমে যাওয়ার আগে ইয়ো-ইয়োটা কয়বার উপরে উঠবে তা দেখাবে।  যেমন, ধরি l = 17 এবং k = 2, সেক্ষেত্রে ইয়ো-ইয়োটা  8.5, 4.25, 2.125, 1.0625 উচ্চতায় উঠবে আর তারপর থেমে যাবে। তাই উত্তর হবে 4

 

ইনপুট

দুটো পূর্ণসংখ্যা l (1 ≤ l ≤ 109) এবং k (2 ≤ k ≤ 100).

 

আউটপুট

যতবার ইয়ো ইয়োটা উপরে উঠবে।

 

উদাহরণ

ইনপুট

 

17 2

 

আউটপুট

4

 

 

 

সমাধান

প্রাথমিক সমস্যা – সাইকেল

 

অ্যালগোরিদম অ্যানালাইসিস          

 

 

ইয়ো-ইয়োর ওঠানামা সিমুলেট করতে হবে এবং গুণতে হবে কয়বার উপরে উঠেছে। ধরা যাক l হচ্ছে ইয়ো-ইয়োটির বর্তমান উচ্চতা। নিচে নামার পরে সেটা উপরে উঠবে কেবলমাত্র যদি এটা 1 এর বেশি উচ্চতায় ওঠে। যদি ওঠার পরিমাণ 1 এর চেয়ে কমে যায়, তাহলে সেটি থেমে যাবে এবং সেই ওপরে ওঠাটা আমরা গোনায় ধরব না।

 

অ্যালগোরিদম বাস্তবায়ন

 

 

ধরি ইয়ো-ইয়োটা l দৈর্ঘ্য নিচে নামলো। ছেড়ে দেওয়ার পরে এটা উপরে উঠবে যদি এবং কেবল যদি এই উপরে ওঠার পরিমাণ একের বেশি হয়। এটা ততক্ষণই সম্ভব যতক্ষণ l / k > 1 এই অসমতাটা  সত্য থাকে।  আমরা res নামের একটা ভ্যারিয়েবলে উপরে ওঠার পরিমাণটা রেখে দিতে পারি।

 

res = 0;

scanf("%lf %lf",&l,&k);

while(l / k > 1.0)

  l /= k, res++;

printf("%d\n",res);