abc234_e Arithmetic Number 题解
1.CSES 1667 Message Route 题解2.P3956 棋盘 题解3.abc233_f Swap and Sort 题解4.abc233_e Σ[k=0..10^100]floor(X/10^k) 题解5.abc233_d Interval 题解6.abc233_c Product 题解7.abc249_f Ignore Operations 题解8.abc249_d Index Trio 题解9.abc248_e K-colinear Line 题解10.abc247_f Cards 题解11.CF1066C Books Queries 题解12.P1038 神经网络 题解13.SeekLuna P1362 拓扑排序 3 题解14.abc232_e Rook Path 题解15.abc235_e MST + 1 题解
16.abc234_e Arithmetic Number 题解
17.P8786 李白打酒加强版 题解18.abc235_d Multiply and Rotate 题解19.CF1095D Circular Dance 题解20.P6201 & P1985 Fliptile S 题解21.CF1183C Computer Game 题解22.CF1095E Almost Regular Bracket Sequence 题解23.abc256_e Takahashi's Anguish 题解24.abc260_g Scalene Triangle Area 题解25.P8714 填空问题 题解26.abc252_d Distinct Trio 题解27.abc252_f Bread 题解28.abc253_e Distance Sequence 题解29.abc250_e Prefix Equality 题解30.abc250_d 250-like Number 题解31.arc164_a Ternary Decomposition 题解32.abc275_f Erase Subarrays 题解33.abc275_e Sugoroku 4 题解34.abc274_d Robot Arms 2 题解35.abc260_f Find 4-cycle 题解36.abc260_e At Least One 题解37.abc273_e Notebook 题解38.abc271_f XOR on Grid Path 题解39.abc271_e Subsequence Path 题解40.abc271_c Manga 题解41.abc269_f Numbered Checker 题解42.abc270_f Transportation 题解43.CF1077E Thematic Contests 题解44.CF1935D Exam in MAC 题解45.CF1144G Two Merged Sequences 题解46.joi2022_yo2_c 国土分割 (Land Division) 题解47.P3588 PUS 题解48.CF1946F Nobody is needed 题解Arithmetic Number
题意
一个数
- 令
, 为 的位数。 ,即序列 为等差数列。- 注意,当
时 也算做等差数列。
给定一个整数
思路
暴力
一个一个数去枚举,每枚举一个就做一次判断,找到第一个等差数,输出。
正解
暴力时间复杂度肯定过不了。
首先,我们可以发现,等差数是非常少的,直接枚举会去判断太多的不合法答案。
但是,我们知道,等差数是必须长成一个等差数列的样子,也就是说,只要枚举一下首项和公差,就能推出整个等差数列。
但还有个问题,我们不清楚它要多少位啊 (其实不知道要多少位也是可以做的)。
我们知道,
所以,只要取这个等差数列的前
最后只需要注意判断等差数列中不能出现大于
Code
点击查看代码
#include <iostream> using namespace std; long long x, y, le; // 记得开 long long int t, flag, sum, st; int main(){ ios::sync_with_stdio(0), cin.tie(0); cin >> x; le = x; while (le) { // 求 x 的位数 st = le % 10, le /= 10; sum++; } for (int i = st; i <= 9; i++) { // 优化一下,枚举首项 for (int d = -9; d <= 9; d++) { // 枚举公差 y = i, t = i, flag = 1; for (int j = 1; j < sum; j++) { // 枚举每一位 t += d; if (t > 9 || t < 0) { // 判断不合法的情况 flag = 0; break; } y = y * 10 + t; } if (flag && y >= x) { // 是一个大于 X 的等差数 cout << y; return 0; // 结束 } } } return 0; }
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/17410289.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步