[ABC234E] Arithmetic Number 题解

题目传送门~

题目分析

题目要求出不小于 k 位的正整数 n 最小的等差数。

  • 首先考虑 k 位等差数能否成功。枚举第一位和公差 k,从而求出每一位的数字,再判断这个数是否大于等于 n,因为是从小到大枚举第一位,所以最先得到的等差数一定是最小的,直接输出即可。

  • 若找不到成功的 k 位数,则直接输出最小的 k+1 位等差数。这一步可以用面向储存的源码级轻量预处理算法实现,即打表。

n1×1010 时,其实就不需要处理 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;
}
posted @   codwarm  阅读(17)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示