酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

题目描述 对于一个数字字符串,如果它满足偶数下标处的数字为偶数且奇数下标处的数字为质数(下标从 0 开始,从左往右依次增大),我们称这它为“好数字”。 比如:"2582" 是“好数字”,因为偶数下标处的数字(下标为 0 的数字为 2、下标为 2 的数字为 8)是偶数,奇数下标处的数字(下标为 1 的数字为 5、下标为 3 的数字为 2)为质数。 但 "3245" 不是“好数字”,因为 3 在偶数下标处但不是偶数。 给你一个整数 n,请你返回长度为 n 且为“好数字”的数字字符串的个数。 由于答案可能会很大,请你将它对 10^9+7 取余后返回 。 注:一个数字字符串是指每一位都由 0 到 9 组成的字符串,且可能包含前导 0 。 请用C++语言以及快速幂完成 输入描述 一个正整数,表示数字字符串的长度 n。 输出描述 一个正整数,表示最终的结果。 样例1 输入 1 输出 5 样例2 输入 5 输出 2000 样例3 输入 50 输出 564908303 提示 对于 100% 的数据,1≤n≤10^9。

```cpp #include <iostream> using namespace std; const int MOD = 1e9 + 7; // 快速幂计算 (a^b) % mod long long fastPow(long long a, long long b, long long mod) { long long res = 1; while (b > 0) { if (b & 1) { res = (res * a) % mod; } a = (a * a) % mod; b >>= 1; } return res; } int countGoodNumbers(long long n) { // 偶数位可选数字:0,2,4,6,8 → 5种 // 奇数位可选数字:2,3,5,7 → 4种 long long evenPos = (n + 1) / 2; // 偶数位数量(包括0) long long oddPos = n / 2; // 奇数位数量 long long ans = (fastPow(5, evenPos, MOD) * fastPow(4, oddPos, MOD)) % MOD; return ans; } int main() { long long n; cin >> n; cout << countGoodNumbers(n) << endl; return 0; } ``` 代码逻辑说明 1. 快速幂:`fastPow`函数用于高效计算大数幂次取模,避免直接计算导致溢出或性能问题。 2. 位数计算:长度为n的数字字符串中,偶数下标位数为`(n + 1) / 2`,奇数下标位数为`n / 2`。 3. 组合计算:偶数位有5种选择(0,2,4,6,8),奇数位有4种选择(2,3,5,7),总数为`5^evenPos * 4^oddPos`。 4. 取模处理:结果对`1e9+7`取模,避免数值过大。 额外注意点 - 快速幂的中间结果需及时取模,防止数值溢出。 - 奇数位和偶数位的数量计算需区分n的奇偶性。 - 最终结果相乘后需再次取模,确保符合题目要求。 [2025-07-21 17:50:31 | AI写代码神器 | 488点数解答]

相关提问