ধরুন আমাদের একটি সংখ্যা l এবং একটি একঘেয়ে ক্রমবর্ধমান ক্রম f(m), যেখানে f(m) =am + bm [log2(m)] + cm^3 এবং (a =1, 2, 3, …), (b =1, 2, 3, …), (c =0, 1, 2, 3, …)
এখানে [log2(m)] হল বেস 2-এর লগ এবং মানটি নিচের দিকে রাউন্ড করা। তাই,
যদি m =1, মান 0 হয়।
m =2-3 হলে, মান হল 1।
m =4-7 হলে, মান হল 2।
যদি m =8-15 হয়, মান হল 3. এবং তাই, অন
আমাদেরকে m এর মান খুঁজে বের করতে হবে যেমন f(m) =l, যদি l অনুক্রমে উপস্থিত না থাকে তাহলে আমাদের 0 প্রিন্ট করতে হবে। আমাদের মনে রাখতে হবে মানগুলি এমনভাবে যাতে সেগুলোকে উপস্থাপন করা যায় 64 বিট এবং তিনটি পূর্ণসংখ্যা a, b এবং c 100 এর কম বা সমান।
সুতরাং, যদি ইনপুট হয় a =2, b =1, c =1, l =12168587437017, তাহলে আউটপুট 23001 হবে f(23001) =12168587437017
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
SMALLER_VAL :=1000000
-
LARGER_VAL :=1000000000000000
-
একটি ফাংশন সমাধান () সংজ্ঞায়িত করুন। এটি a, b, c, n
লাগবে -
উত্তর :=a * n
-
lg_val :=n
এর লগ বেস 2 এর মেঝে -
ans :=ans + b * n * lg_val
-
ans :=ans + c * n^3
-
উত্তর ফেরত দিন
-
প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
-
শুরু :=1
-
শেষ :=SMALLER_VAL
-
যদি c 0 এর মত হয়, তাহলে
-
শেষ :=LARGER_VAL
-
-
উত্তর :=0
-
শুরু করার সময় <=শেষ করুন, করুন
-
মধ্য :=(শুরু + শেষ) / 2 (শুধুমাত্র পূর্ণসংখ্যা অংশ নিন)
-
val :=সমাধান (a, b, c, mid)
-
যদি val k এর মত হয়, তাহলে
-
উত্তর :=মধ্য
-
লুপ থেকে বেরিয়ে আসুন
-
-
অন্যথায় যখন val> k, তারপর
-
শেষ :=মধ্য - 1
-
-
অন্যথায়,
-
শুরু :=মধ্য + 1
-
-
-
উত্তর ফেরত দিন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
from math import log2, floor SMALLER_VAL = 1000000 LARGER_VAL = 1000000000000000 def solve(a, b, c, n) : ans = a * n lg_val = floor(log2(n)) ans += b * n * lg_val ans += c * n**3 return ans def get_pos(a, b, c, k) : begin = 1 end = SMALLER_VAL if (c == 0) : end = LARGER_VAL ans = 0 while (begin <= end) : mid = (begin + end) // 2 val = solve(a, b, c, mid) if (val == k) : ans = mid break elif (val > k) : end = mid - 1 else : begin = mid + 1 return ans a = 2 b = 1 c = 1 k = 12168587437017 print(get_pos(a, b, c, k))
ইনপুট
2,1,1,12168587437017
আউটপুট
23001