376
Cerința
Se dau n întrebări de forma: Câte palindromuri există în intervalul [a, b]?, unde a și b sunt numere naturale date, cu a ≤ b.
Date de intrare
Fișierul de intrare nr_pal.in conține pe prima linie numărul natural nenul n, iar pe următoarele n linii, n perechii de forma a b ce reprezintă capetele intervalelor.
Date de ieșire
Fișierul de ieșire nr_pal.out va conține răspunsurile la cele n întrebări, fiecare pe câte un rând.
Restricții și precizări
0 < n ≤ 100.0000 ≤ a ≤ b ≤ 1.000.000.000
Exemplu
nr_pal.in
2 5 23 1 255
nr_pal.out
7 34
Explicație
La prima întrebare în intervalul [5,23] exista 7 palindromuri: 5,6,7,8,9,11,22.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("nr_pal.in");
ofstream cout("nr_pal.out");
int nrcif(int n)
{
int cnt = 0;
if(n <= 9)
return 1;
while(n)
{
cnt++;
n /= 10;
}
return cnt;
}
int put(int n)
{
int p = 1;
for(int i = 1 ; i <= n ; i++) p *= 10;
return p;
}
int f(int n)
{
int ogl = n;
while(n)
{
ogl = ogl * 10 + n % 10;
n /= 10;
}
return ogl;
}
int ff(int n)
{
int ogl = n;
n /= 10;
while(n)
{
ogl = ogl * 10 + n % 10;
n /= 10;
}
return ogl;
}
int pal(int n)
{
int cnt = 0;
int nr = nrcif(n);
for(int i = 1 ; i < nr ; ++i)
cnt = cnt+ put((i - 1) / 2) * 9;
int p = put((nr - 1)/2);
int y = n/put((nr / 2));
cnt = cnt + (y - p + 1);
if(nr % 2 == 0)
{
if(f(y) > n) cnt--;
}
else if(ff(y) > n) cnt--;
return cnt;
}
int main()
{
int n;
int a , b;
cin >> n;
for(int i = 0 ; i < n ; ++i)
{
cin >> a >> b;
cout << pal(b) - pal(a - 1) << '\n';
}
return 0;
}
Comentarii