ABC D求条 玄7关
  • 板块灌水区
  • 楼主Little_x_starTYJ
  • 当前回复11
  • 已保存回复11
  • 发布时间2024/7/20 21:41
  • 上次更新2024/7/21 00:37:54
查看原帖
ABC D求条 玄7关
902351
Little_x_starTYJ楼主2024/7/20 21:41

rt。

#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
inline int pow2(int k, int f) {
	int o = 1;
	while (f--)
		o *= k;
	return o;
}
int a[] = {
	0, 10, 9, 90,
	90,
	900,
	900,
	9000,
	9000,
	90000,
	90000,
	900000,
	900000,
	9000000,
	9000000,
	90000000,
	90000000,
	900000000,
	900000000,
	9000000000,
	9000000000,
	90000000000,
	90000000000,
	900000000000,
	900000000000,
	9000000000000,
	9000000000000,
	90000000000000,
	90000000000000,
	900000000000000,
	900000000000000,
	9000000000000000,
	9000000000000000,
	90000000000000000,
	90000000000000000,
	900000000000000000,
	900000000000000000,
	9000000000000000000
};
signed main() {
	int n;
	cin >> n;
	/*
	0
	1
	2
	3
	4
	5
	6
	7
	8
	9
	个数:10
	11
	22
	33
	44
	55
	66
	77
	88
	99
	个数:9
	101
	111
	121
	131
	141
	151
	161
	171
	181
	191
	个数:10
	...
	1001
	1111
	1221
	1331
	1441
	1551
	1661
	1771
	1881
	1991
	10个
	10001
	10101
	10201
	10301
	10401
	10501
	10601
	10701
	10801
	10901
	11111
	12121
	13131
	14141
	15151
	16161
	17171
	18181
	19191
	...
	100001
	101101
	1000001
	1001001
	1002001
	1003001
	1004001
	1005001
	1006001
	1007001
	1008001
	1009001
	100
	*/
	unsigned long long sum = 0;
	int i;
	for (i = 1; ; i++) {
		sum += a[i];
		if (sum >= n) {
			if (sum == n)
				i++;
			break;
		}
	}
	sum = n;
	for (int j = 1; j < i; j++)
		sum -= a[j];
	if (i % 2 == 0) {
		int c[100];
		bool f = 0;
		int id2 = 0;
		while (i) {
			for (int j = 0; j < 10; j++) {
				if (!f && j == 0)
					continue;
				int k = (!f ? j : (j + 1));
				int o = pow2((unsigned long long)10, (unsigned long long)ceil((i - 2) / 2.0)) * k;
				if (o > sum) {
					sum -= pow2((unsigned long long)10, (unsigned long long)ceil((i - 2) / 2.0)) * (k - 1);
					c[++id2] = j;
					break;
				} else if (o == sum) {
					sum -= o;
					c[++id2] = j;
					break;
				}
			}
			i -= 2;
			f = 1;
		}
		string b = "";
		for (int j = 1; j <= id2; j++) {
			b += to_string(c[j]);
		}
		for (int j = id2; j >= 1; j--)
			b += to_string(c[j]);
		cout << b;
	} else {
		bool f = 0;
		int c[100];
		int id2 = 0;
		while (i > 1) {
			for (int j = 0; j < 10; j++) {
				if (!f && j == 0)
					continue;
				int k = (!f ? j : (j + 1));
				int o = pow2((unsigned long long)10, (unsigned long long)ceil((i - 2) / 2.0)) * k;
				if (o > sum) {
					sum -= pow2((unsigned long long)10, (unsigned long long)ceil((i - 2) / 2.0)) * (k - 1);
					c[++id2] = j;
					break;
				} else if (o == sum) {
					sum -= o;
					c[++id2] = j;
					break;
				}
			}
			i -= 2;
			f = 1;
		}
		int k = 0;
		if (sum != 0)
			for (int j = 0; j < 10; j++) {
				sum--;
				if (sum == 0) {
					k = j;
					break;
				}
			}
		string b = "";
		for (int j = 1; j <= id2; j++) {
			b += to_string(c[j]);
		}
		b += to_string(k);
		for (int j = id2; j >= 1; j--)
			b += to_string(c[j]);
		cout << b;
	}
	return 0;
}

WA*3

2024/7/20 21:41
加载中...