c++求1+11+111+1111+…+11….11(n个1)的和除以7的余数是多少?n<=1000000
时间: 2023-07-02 18:16:01 浏览: 289
vc++,10亿个数整除7个数,10亿次求余,编程语言性能测试
可以使用数学归纳法求解这个问题,从而避免暴力枚举。
首先观察题目中给出的数列,我们可以发现:第 $i$ 项由 $i-1$ 项乘以 10 再加上 1 构成。即:
$$
a_i = a_{i-1} \times 10 + 1
$$
例如,第 2 项 $= 1 \times 10 + 1 = 11$,第 3 项 $= 11 \times 10 + 1 = 111$。
接下来,我们将数列中的每一项除以 7 取余数,然后观察余数序列:
$$
a_1 \bmod 7, a_2 \bmod 7, a_3 \bmod 7, \cdots
$$
可以发现,余数序列为 1, 4, 5, 2, 0, 1, 4, 5, 2, 0, ...,即以 1, 4, 5, 2, 0 循环出现。因此,我们可以通过分别求出这些数的前缀和来计算数列的和除以 7 的余数。
具体来说,设 $s_i$ 表示余数序列前 $i$ 项的和,则:
$$
s_i = \sum_{j=1}^{i} a_j \bmod 7
$$
根据前面的推导,余数序列是循环出现的,因此我们只需要计算出一个循环节(即 1, 4, 5, 2, 0),然后计算循环节中的前缀和即可。例如,设 $t$ 表示循环节的长度,则:
$$
s_n = s_{n \bmod t} + \frac{n}{t} \times s_t
$$
最后,我们只需要先求出循环节的前缀和 $s_t$,然后计算出 $s_n$ 即可。
下面是完整的 C++ 代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
// 计算循环节的前缀和
vector<int> prefix_sum = {1, 5, 0, 0, 0};
for (int i = 1; i < prefix_sum.size(); i++) {
prefix_sum[i] = (prefix_sum[i-1] * 10 + 1) % 7;
}
// 计算循环节的长度
int t = 5;
while (prefix_sum[t % 5] != 1) {
t++;
}
// 计算数列的和除以 7 的余数
vector<int> sum(t);
for (int i = 0; i < t; i++) {
sum[i] = prefix_sum[i];
if (i > 0) {
sum[i] = (sum[i] + sum[i-1]) % 7;
}
}
int result = (sum[(n-1) % t] + (n-1) / t * sum[t-1]) % 7;
cout << result << endl;
return 0;
}
```
时间复杂度为 $O(1)$,可以通过本题。
阅读全文