何故か
https://competitiveprogramming.info/topcoder/srm
に317のlinkが無い.
回文となっている数字が$lower \sim upper$まで数えていくつあるか.制約は$\leq 10 ^9$と大きいが,大きい数の回文数というのは$1 \sim 10000$の数字を反転させたものになっているはずなので,偶数桁の場合はそのまま反転,奇数桁の場合は真ん中に$0 \sim 9$をはさんだ数をsetに突っ込んでいく.答えはsetの大きさになる.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
| #include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)
#define INF 1<<30
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
bool ch(int x) {
string s = "";
while(x) {
s += char('0' + x % 10);
x /= 10;
}
reverse(s.begin(), s.end());
rep(i, s.size()/2) {
if(s[i] == s[s.size()-1-i]) continue;
return false;
}
return true;
}
vector<ll> rev(int x) {
string s = "";
while(x) {
s += char('0' + x % 10);
x /= 10;
}
string t = s;
reverse(s.begin(), s.end());
vector<string> v;
v.push_back(s + t);
rep(i, 10) {
string ns = s + char('0' + i) + t;
v.push_back(ns);
}
vector<ll> res;
rep(i, v.size()) {
ll ret = 0, k = 1;
for(int j = v[i].size()-1; j >= 0; j--) {
ret += int(v[i][j] - '0') * k;
k *= 10;
}
res.push_back(ret);
}
return res;
}
class PalindromicNumbers {
public:
int countPalNums(int lower, int upper) {
set<int> st;
for(ll i = 1; i <= 10000; i++) {
if(lower <= i && i <= upper && ch(i) && st.find(i) == st.end()) {
st.insert(i);
}
vector<ll> ret = rev(i);
rep(j, ret.size()) {
int x = ret[j];
if(lower <= x && x <= upper && ch(x) && st.find(x) == st.end()) {
st.insert(x);
}
}
}
return st.size();
}
};
|