1 条题解
-
0
自动搬运
来自洛谷,原作者为

0x282e202e2029
I love U Bones搬运于
2025-08-24 22:42:43,当前版本为作者最后更新于2023-06-20 17:53:14,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
P8811 [蓝桥杯 2022 国 C] 六六大顺 题解
- 本题第一篇给了代码的题解
老规矩,题目传送门
思路
$$\begin{aligned} S &= \sum _ {i = 1} ^ {n} {\underbrace{666 \cdots 66}_{\text{i 个 6}}} ^ 2 \\ &= \sum _ {i = 1} ^ {n} {(\frac{2}{3} \cdot \underbrace{999 \cdots 99}_{\text{i 个 9}})} ^ 2 \\ &= \sum _ {i = 1} ^ {n} \frac{4}{9} \cdot (10 ^ i - 1) ^ 2 \\ &= \frac{4}{9} \cdot \sum _ {i = 1} ^ {n} (10 ^ {2i} - 2 \cdot 10 ^ i + 1) \\ &= \frac{4}{9} \cdot (\underbrace{101010 \cdots 1010}_{\text{n 个 10}}0 + \underbrace{222 \cdots 22}_{\text{n 个 2}}0 + n) \end{aligned}$$见 识高精。
但是,如果你直接用封装好的板子,MLE。
大佬们又说了:把
int换成char!换了,TLE。
那怎么办?
我们发现,现在常见的高精度模板都使用了
vector这个常数极大的东西,反而没有用int数组模拟的。因此,让我们回归原始,再运用几个卡常小妙招,就能 AC 了。
AC 代码
#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; }
- 1
信息
- ID
- 7988
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者