[ABC234E] Arithmetic Number 题解
题目分析
题目要求出不小于 $k$ 位的正整数 $n$ 最小的等差数。
-
首先考虑 $k$ 位等差数能否成功。枚举第一位和公差 $k$,从而求出每一位的数字,再判断这个数是否大于等于 $n$,因为是从小到大枚举第一位,所以最先得到的等差数一定是最小的,直接输出即可。
-
若找不到成功的 $k$ 位数,则直接输出最小的 $k+1$ 位等差数。这一步可以用面向储存的源码级轻量预处理算法实现,即打表。
当 $n \ge 1 \times 10^{10}$ 时,其实就不需要处理 $n$ 了,因为不存在 $10$ 位以上的等差数(数字只有十个)。
代码
// Problem: AT_abc234_e [ABC234E] Arithmetic Number
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/AT_abc234_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// Author: Eason
// Date:2023-10-14 14:34:14
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
string s;
//打出n位的最小等差数的表
ll minx[15] = {0,1,12,123,1234,12345,123456,1234567,12345678,123456789,9876543210};
int main()
{
cin >> s;
int n = s.size();
ll num = 0,fin = 0;
for (int i = 0;i < s.size();i ++) num = num * 10 + s[i]-48; //求出原数
for (int i = s[0]-'0';i <= 9 && !fin;i ++) //枚举首位
for (int j = -9;j <=9;j ++) //枚举差
{
ll tpi = i,c = 0,flag = 1;
for (int k = 1;k <= n;k ++) //根据首位和差算出每一位
{
if (tpi >= 0 && tpi <= 9) c = c * 10 + tpi; //计算
else
{
flag = 0;
break;
}
tpi += j; //等差序列 加上差值
}
if (flag && c >= num)
{
//如果成功则直接输出
//因为是从小到大枚举的,所以一定是最优解
cout << c << endl;
fin = 1;
break;
}
}
//如果n位数不成功,则输出最小的n+1位等差数
if (!fin) cout << minx[n+1];
return 0;
}

浙公网安备 33010602011771号