思路
当个位是 0 或 5 时才是 5 的倍数。
不难发现如果第 i 位是 0 或 5 他的贡献是 2^{i-1} 。
字符串会重复 k 次,假设原字符串的贡献是 ans ,那么总贡献是 \displaystyle\sum_{i=0}^{k-1} 2^{i\times n}\times ans ( n 是原字符串长度)。
将式子化简再用费马小定理求逆元就变成了 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;
}