b_lc_统计好数字的数量(排列数+组合数+快速幂)

好数字 是(下标从 0 开始)偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 (2,3,5 或 7)。
比方说,"2582" 是好数字,因为偶数下标处的数字(2 和 8)是偶数且奇数下标处的数字(5 和 2)为质数。
一个 数字字符串 是每一位都由 0 到 9 组成的字符串,且可能包含前导 0 。(n<=1e18)

输入:n = 1
输出:5
解释:长度为 1 的好数字包括 "0","2","4","6","8" 。

思路:排列数 = 数字种类 ^ (坑位数);组合数 = 排列数相乘

class Solution {
public:
    long long mod = 1e9 + 7;
    long long quickPow(long long a, long long b) {
        long long ans = 1;
        while (b) {
            if (b & 1) ans = (ans * a) % mod;
            a = (a * a) % mod;
            b >>= 1;
        }
        return ans;
    }
    int countGoodNumbers(long long n) {
        return quickPow(5, (n + 1) / 2) * quickPow(4, n / 2) % mod;
    }
};
posted @ 2021-07-24 21:15  童年の波鞋  阅读(55)  评论(0编辑  收藏  举报