ধরুন আমাদের একটি পূর্ণসংখ্যা n আছে, আমাদের ধনাত্মক পূর্ণসংখ্যার সংখ্যা খুঁজে বের করতে হবে যা n-এর থেকে কম বা সমান, যেখানে পূর্ণসংখ্যা সংখ্যার অন্তত একটি সংখ্যা একাধিকবার ঘটছে।
সুতরাং, যদি ইনপুট n =200 এর মত হয়, তাহলে আউটপুট হবে 38
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি অ্যারের সংজ্ঞা দিন a
-
শুরু করার জন্য x :=n, যখন x অ-শূন্য হয়, x আপডেট করুন :=x / 10, করুন −
-
a
এর শেষে x mod 10 সন্নিবেশ করুন
-
-
অ্যারেটি বিপরীত করুন a
-
ret :=n
-
শুরু করার জন্য w :=1, d :=1, যখন w
-
d :=d * মিনিট(9, 10 − w + 1)
-
ret :=ret − d
-
-
একটি ফাংশন go() সংজ্ঞায়িত করুন। এর জন্য কোন যুক্তি লাগে না।
-
b :=(1 বিটওয়াইসে বাম শিফট 10) − 1
-
আরম্ভ করার জন্য i :=0, যখন i
-
শুরু করার জন্য d :=i <1, যখন d করুন
-
ret :=ret − x
-
-
যদি ((1 বিটওয়াইসে বাম শিফট a[i]) bitwise AND b) non−zero হয়, তাহলে
-
b :=b XOR (1 বিটওয়াইজ বাম শিফট a[i])
-
-
অন্যথায়
-
ফেরত
-
-
-
(1 দ্বারা ret কমান)
-
-
go()
ফাংশনটিকে কল করুন -
রিটার্ন রিটার্ন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; int solve(int n) { vector<int> a; for (int x = n; x; x /= 10) a.push_back(x % 10); reverse(a.begin(), a.end()); int ret = n; for (int w = 1, d = 1; w < a.size(); ++w) { d *= min(9, 10 − w + 1); ret −= d; } auto go = [&]() { int b = (1 << 10) − 1; for (int i = 0; i < a.size(); ++i) { for (int d = (i < 1); d < a[i]; ++d) { int x = 0; if ((1 << d) & b) ++x; for (int j = i + 1; j < a.size(); ++j) x *= 10 − j; ret −= x; } if ((1 << a[i]) & b) b ^= (1 << a[i]); else return; } −−ret; }; go(); return ret; } int main(){ cout << solve(200) << endl; return 0; }
ইনপুট
200
আউটপুট
38