P8811 [蓝桥杯 2022 国 C] 六六大顺
题目描述
六六大顺,本指农历六月初六。多用于祝福中年人士家庭幸福,工作顺利,事业有成,身体健康。源自《左传》“君义,臣行,父慈,子孝,兄爱,弟敬,此数者累谓六顺也。”
666 在我国自古以来是一个吉祥的数字,定义数列 A=(a1,a2,⋯ ,ai,⋯ )A = (a_1,a_2,\cdots,a_i,\cdots)A=(a1,a2,⋯,ai,⋯),其中 a1=6,a2=66,⋯ ,ai=10⋅ai−1+6a_1 = 6, a_2 = 66, \cdots, a_i = 10\cdot a_{i−1}+6a1=6,a2=66,⋯,ai=10⋅ai−1+6。
定义一个数列 B=(b1,b2,⋯ ,bi,⋯ )B = (b_1,b_2,\cdots,b_i,\cdots)B=(b1,b2,⋯,bi,⋯),其中 b1=6×6,b2=66×66,⋯ ,bi=ai×aib_1 = 6 \times 6, b_2 = 66\times66, \cdots, b_i = a_i \times a_ib1=6×6,b2=66×66,⋯,bi=ai×ai。
现在小蓝想知道数列 BBB 的前 nnn 项的和是多少,你能帮帮小蓝吗?
输入格式
输入一行包含一个正整数 nnn。
输出格式
输出一行包含一个整数表示数列 BBB 前 nnn 项的和。
输入输出样例 #1
输入 #1
3
输出 #1
447948
说明/提示
【样例说明】
b1=6×6=36,b2=66×66=4356,b3=666×666=443556b_1 = 6×6 = 36,b_2 = 66×66 = 4356,b_3 = 666×666 = 443556b1=6×6=36,b2=66×66=4356,b3=666×666=443556,所以前三项的和为 36+4356+443556=44794836 + 4356 + 443556 = 44794836+4356+443556=447948。
【评测用例规模与约定】
对于 20%20\%20% 的评测用例,1≤n≤1001≤n≤1001≤n≤100;
对于 50%50\%50% 的评测用例,1≤n≤1051≤n≤10^51≤n≤105;
对于所有评测用例,1≤n≤1071\le n\le 10^71≤n≤107。
蓝桥杯 2022 国赛 C 组 H 题。
C++实现
#include <stdio.h>
using namespace std;
const int MAX = 2e7 + 1;
int n, arr[MAX];//arr模拟高精数组
int main()
{
scanf("%d", &n);
arr[0] = 4 * n % 10, arr[1] = 4 * n / 10;//将4n存入数组
for (int i = 1; i <= n; ++i)//++i卡常小妙招(bushi
{
arr[i << 1] = 4, arr[i] -= 8;//将1010…100,22…20的4倍加给数组
arr[i + 1] += arr[i] / 10, arr[i] %= 10;
if (arr[i] < 0)
{
arr[i] += 10, --arr[i + 1];
}//进退位
}
for (int i = n + 1; arr[i] < 0; ++i)
{
arr[i + 1] += arr[i] / 10, arr[i] %= 10;
arr[i] += 10, --arr[i + 1];
}//单纯进位
for (int i = 2 * n - 1; ~i; --i)
{
arr[i] += 10 * arr[i + 1];
putchar(arr[i] / 9 + '0');
arr[i] %= 9;
}//一边输出一边除以9
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容