ধরুন N ধাপ সহ একটি সিঁড়ির কেস আছে। কেউ হয় ধাপে ধাপে যেতে পারে, অথবা প্রতিটি ধাপে, একজন সর্বাধিক N ধাপে লাফ দিতে পারে। আমরা উপরের তলায় যেতে পারি এমন উপায় খুঁজে বের করতে হবে। N এর মান বড় হতে পারে আমরা শুধুমাত্র প্রথম এবং শেষ K সংখ্যায় আগ্রহী।
সুতরাং, যদি ইনপুটটি N =10 k =2 এর মত হয়, তাহলে আউটপুট হবে 63 কারণ এখানে 10টি ধাপ আছে, যদি S সংখ্যার উপায় থাকে যার মাধ্যমে আমরা শীর্ষে যেতে পারি, তাহলে Sকে wxyz ফর্মের বিবেচনা করুন। তাই, wx + yz এর সারাংশ হল 63।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- N :=N - 1
- c :=2 * (k + log(N);base10) এর সিলিং
- e :=N, b :=2, s :=1
- যখন e> 0, do
- যদি e বিজোড় হয়, তাহলে
- s :=(s*b) এর প্রথম p-c ডিজিটের সংখ্যা যেখানে p হল s*b-এর সংখ্যার সংখ্যা
- e :=e/2 এর ফ্লোর
- b :=(b*b) এর প্রথম p-c অঙ্কের সংখ্যা যেখানে p হল b*b-এর সংখ্যার সংখ্যা
- যদি e বিজোড় হয়, তাহলে
- s :=s-এর প্রথম p - k অঙ্কের সংখ্যা, যেখানে p হল s-এ অঙ্কের সংখ্যা
- r :=s + (2^N) মোড 10^k
- রিটার্ন r
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
from math import log10,ceil def solve(N,k): N -= 1 c = 2*ceil(k + log10(N)) e = N b = 2 s = 1 while e > 0: if e % 2 == 1: s = int(str(s*b)[:c]) e //=2 b = int(str(b*b)[:c]) s = str(s)[:k] r = int(s) + pow(2, N, 10**k) return r N = 10 k = 2 print(solve(N,k))
ইনপুট
10, 2
আউটপুট
63