5的倍数的个数的题解

思路

当个位是 05 时才是 5 的倍数。
不难发现如果第 i 位是 05 他的贡献是 2^{i-1}

字符串会重复 k 次,假设原字符串的贡献是 ans ,那么总贡献是 \displaystyle\sum_{i=0}^{k-1} 2^{i\times n}\times ansn 是原字符串长度)。

将式子化简再用费马小定理求逆元就变成了 2^{nk}\times {(2^{n}-1)}^{1e9+5} ,别忘了随时取模。
核心代码

代码

#include<bits/stdc++.h>
using namespace std;
const int Mod=1e9+7;
long long k,ans,sum;
string s;
long long qpow(long long a, long long b, long long c)//快速幂 
{
    if(b==0) return 1;
    if(b==1) return a%c;
    long long t=qpow(a,b/2,c)%c;
    return (((t*t)%c)*(b%2==0?1:a%c))%c;
}
int main()
{
	cin>>s>>k;
	for(int i=0;i<s.size();++i)
	if(s[i]=='0'||s[i]=='5') ans+=qpow(2,i,Mod),ans%=Mod;//记录原字符串的贡献
	cout<<(((qpow(2,s.size()*k,Mod)-1)*(qpow(qpow(2,s.size(),Mod)-1,1e9+5,Mod)))%Mod*ans)%Mod;//这里用到刚刚说的公式 
	return 0;
} 
1 个赞

戈门,你这样的代码看着真的难受,AC代码也不是不给发吧,我暑假那么多篇题解不还是啥事没有

2^{nk} 少了个 -1