题目链接:https://ac.nowcoder.com/acm/contest/57322/H
题目描述:
猫猫虫枫落最近在思考一个问题:
对于一个十进制正整数(不含前导零),如果将该数字在某一位分割后,得到的两部分完全相等,并且存在某两个相邻数位相同,则称该数字为叠加数。
例如:对于数字 12331233,可以将其分割为 1233和 1233,这两部分完全相等,并且存在相邻的两个数字相同,那么数字 12331233是一个叠加数。
对于数字 123451234和 123321,无论如何也无法分割为完全相等的两部分,则他们都不是叠加数。对于数字 12341234,可以将其分割为 1234和 1234,这两部分完全相等,但不存在某两个相邻数位相同,所以12341234 不是叠加数。
现在,猫猫虫想知道在所有自然数中,前 k 大的叠加数之和是多少。
——————————————————————————
可以考虑只枚举一半,计算和时,ans += i * (与i位数相同的10^p) + i, 从而得到叠加数
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define qwq ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
const int N = 100010, M = 200010, INF = 0x3f3f3f3f;
int n, m, k;
int a[N];
int len(ll x) {
int p = 0;
while (x) {
++ p; x /= 10;
}
//返回位数对应的10^p
ll k = 1;
for (int i = 0; i < p; ++ i)
k *= 10;
return k;
}
bool check(ll x) {
vector <int> a;
while (x)
a.push_back(x % 10), x/= 10;
if (a[0] == a.back())
return 1; //首位与末尾产生相邻数字
for (int i = 1; i < a.size(); ++ i)
if (a[i] == a[i - 1]) return 1; //有相邻数字
return 0; //无相邻数字
}
int main(){
qwq; int T;
cin >> k;
ll ans = 0;
for (ll i = 1; k; ++ i) {
if(check(i)) k --, ans += i * len(i) + i;
}
cout << ans;
return 0;
}