bdfz_2024_summer/day7/P5431/chat.md
2024-08-09 12:02:40 +08:00

84 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

以下是上述问题的 C++ 实现代码,使用了快速幂计算逆元和高效的 IO 处理方式,以应对可能的大规模数据输入。
### C++ 实现
```cpp
#include <iostream>
using namespace std;
// 快速幂计算 (base^exp) % mod
long long mod_exp(long long base, long long exp, long long mod) {
long long result = 1;
while (exp > 0) {
if (exp % 2 == 1) {
result = (result * base) % mod;
}
base = (base * base) % mod;
exp /= 2;
}
return result;
}
// 模逆元计算: a^(p-2) % p
long long mod_inverse(long long a, long long p) {
return mod_exp(a, p - 2, p);
}
int main() {
ios::sync_with_stdio(false); // 提高cin/cout的效率
cin.tie(0); // 取消cin与cout的关联
int n;
long long p, k;
cin >> n >> p >> k;
long long result = 0;
long long k_power = 1; // k^i
for (int i = 0; i < n; ++i) {
long long a_i;
cin >> a_i;
long long inv_a = mod_inverse(a_i, p);
long long term = (k_power * inv_a) % p;
result = (result + term) % p;
// 更新k_power
k_power = (k_power * k) % p;
}
cout << result << endl;
return 0;
}
```
### 代码解释
1. **快速幂函数 `mod_exp`**:通过二进制分解指数,实现快速计算幂次取模。
2. **模逆元函数 `mod_inverse`**:利用费马小定理,通过快速幂计算模逆元。
3. **高效的输入输出**
- `ios::sync_with_stdio(false)` 关闭 C++ 的 IO 与 C 的 IO 之间的同步,提高 IO 效率。
- `cin.tie(0)` 解除 `cin``cout` 的关联,避免在每次 `cin` 之前执行 `cout`,进一步提升效率。
4. **主函数逻辑**
- 读取输入的 `n`, `p`, `k`,以及数组 `a_i`
- 逐步计算每个 $k^i \times a_i^{-1} \mod p$ 并累加到结果中。
- 最终输出累加结果。
### 样例测试
使用样例输入:
```
6 233 42
1 4 2 8 5 7
```
程序将输出:
```
91
```
### 性能优化
`n` 非常大的情况下,使用上述 C++ 实现,可以确保在合理时间内完成计算。此实现充分利用了快速幂和费马小定理的性质,以及 C++ 的高效输入输出特性。