题解 CF327C 【Magic Five】

本文深入解析了一道ACM竞赛中的复杂数学问题,通过搜索特定数值、应用等比数列求和公式、费马小定理及快速幂算法,提供了一套完整的解题思路与AC代码实现。

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

首先先搜索一遍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 }

 

转载于:https://www.cnblogs.com/ilverene/p/9818995.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值