• 题解 CF327C 【Magic Five】


    这道题带坑,假如没有发现肯定会爆。

    首先先搜索一遍0和5,储存在数组a里面。

    那么应当有2 ^ a1 +2 ^ a2 +...+ 2 ^ an。

    然而这道题没那么简单,数串还可以重复k次。

    因此,需要在此基础上在乘上1 + 2 ^ l + 2 ^ 2l +...+ 2 ^ (k - 1)l。其中l为数串长度。

    如果到这里就提交,那就只能和AC说拜拜了。

    为了省去不必要的计算,可以通过等比数列求和公式将后一个算式化简为(2 ^ kl - 1) / (2 ^ l - 1)

    可即便如此还是会炸,只能借助费马小定理:a ^ (p-1) % p == 1。

    所以算式可以进一步化简为(2 ^ kl - 1) * (a ^ (l - 1) ^ (p-2)) / (2 ^ l - 1)

    然后快速幂就OK了。

    AC代码如下:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int MODE = 1000000007;
     8 const int maxn = 100100;
     9 typedef long long ll;
    10 
    11 ll power(ll a, ll n) {
    12     ll b = 1;
    13     while(n) {
    14         if(n & 1) {
    15             b *= a;
    16             b %= MODE;
    17         }
    18         n >>= 1;
    19         a *= a;
    20         a %= MODE;
    21     }
    22     return b;
    23 }
    24 
    25 ll k, ans, cur;
    26 string num;
    27 
    28 int main() {
    29     cin >> num >> k;
    30     for(int i = 0; i < num.length(); i++) {
    31         if(num[i] == '0' || num[i] == '5') {
    32             ans += power(2, i);
    33             ans %= MODE;
    34         }
    35     }
    36     cur += power(power(2, num.length()) - 1, MODE - 2) * (power(2, num.length() * k) - 1);
    37     cur %= MODE;
    38     ans *= cur;
    39     ans %= MODE;
    40     
    41     cout << ans;
    42 }
  • 相关阅读:
    AC3 encoder flow
    AC3 IMDCT
    AC3 Rematrix
    AC3 channel coupling
    AC3 mantissa quantization and decoding
    AC3 bit allocation
    AC3 exponent coding
    C# 判断字符串为数字 int float double
    vs 修改默认的调试浏览器
    visio 如何扩大画布大小
  • 原文地址:https://www.cnblogs.com/ilverene/p/9818995.html
Copyright © 2020-2023  润新知