मान लीजिए कि हमारे पास एक धनात्मक पूर्णांक N है, जिसे एक पालिंड्रोम होने पर एक सुपरपैलिंड्रोम कहा जाता है, और यह एक पैलिंड्रोम का वर्ग भी है। अब मान लें कि हमारे पास दो धनात्मक पूर्णांक L और R हैं, हमें [L, R] की समावेशी श्रेणी में सुपरपैलिंड्रोम की संख्या ज्ञात करनी है।
इसलिए, अगर इनपुट एल =5 और आर =500 जैसा है, तो आउटपुट 3 होगा, सुपरपैलिंड्रोम 9, 121, 484 हैं।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
फ़ंक्शन हेल्पर () को परिभाषित करें, इसमें x, m, M, lb, ub,
लगेगा -
यदि x> ub, तो -
-
वापसी
-
-
अगर x>=lb और (x * x) पैलिंड्रोम है, तो -
-
(उत्तर 1 से बढ़ाएँ)
-
-
प्रारंभ करने के लिए मैं:=1, जब एम + 2 * मैं <=एम, अद्यतन (मैं 1 से बढ़ाएँ), यह करें:
-
डब्ल्यू:=10^(एम + 2 * आई -1)
-
डब्ल्यू:=10^i
-
इनिशियलाइज़ z :=1 के लिए, जब z <=9, अपडेट करें (1 से z बढ़ाएँ), करें -
-
हेल्पर (जेड * डब्ल्यू + एक्स * डब्ल्यू, एम + 2 * आई, एम, एलबी, यूबी)
-
-
-
मुख्य विधि से, निम्न कार्य करें -
-
lb :=L का वर्गमूल, ub :=R का वर्गमूल
-
एम:=यूबी बेस 10 + 1 का लॉग निष्पादित करें
-
इनिशियलाइज़ z :=0 के लिए, जब z <=9, अपडेट करें (1 से z बढ़ाएँ), do−
-
हेल्पर (जेड, 1, एम, एलबी, यूबी)
-
हेल्पर (11 * जेड, 2, एम, एलबी, यूबी)
-
-
वापसी उत्तर
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
class Solution {
int ans = 0;
public:
int superpalindromesInRange(string L, string R){
long double lb = sqrtl(stol(L)), ub = sqrtl(stol(R));
int M = log10l(ub) + 1;
for (int z = 0; z <= 9; z++) {
helper(z, 1, M, lb, ub);
helper(11 * z, 2, M, lb, ub);
}
return ans;
}
private:
void helper(long x, int m, int M, long double lb, long double ub){
if (x > ub)
return;
if (x >= lb && is_palindrome(x * x))
ans++;
for (int i = 1; m + 2 * i <= M; i++) {
long W = powl(10, m + 2 * i - 1) + 1;
long w = powl(10, i);
for (int z = 1; z <= 9; z++)
helper(z * W + x * w, m + 2 * i, M, lb, ub);
}
}
bool is_palindrome(long x){
if (x == 0)
return true;
if (x % 10 == 0)
return false;
long left = x, right = 0;
while (left >= right) {
if (left == right || left / 10 == right)
return true;
right = 10 * right + (left % 10), left /= 10;
}
return false;
}
};
main(){
Solution ob;
cout << (ob.superpalindromesInRange("5", "500"));
} इनपुट
"5", "500"
आउटपुट
3