Description
给一个字符串s,重复k次,要求去掉其中若干数时候使得该数可以被5整除,允许删除后有前置0存在,求方案数
Input
第一行一个数字串s,第二行一整数k表示重复次数(1<=|s|<=1e5,1<=k<=1e9)
Output
输出方案数,结果模1e9+7
Sample Input
1256
1
Sample Output
4
Solution
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
const int mod=1e9+7,maxn=100001;
int mod_pow(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)ans=(ll)ans*a%mod;
a=(ll)a*a%mod;
b>>=1;
}
return ans;
}
char s[maxn];
int k,f2[maxn];
int main()
{
f2[0]=1;
for(int i=1;i<maxn;i++)
{
f2[i]=f2[i-1]<<1;
if(f2[i]>=mod)f2[i]-=mod;
}
while(~scanf("%s%d",s,&k))
{
int ans=0,len=strlen(s);
for(int i=0;i<len;i++)
if(s[i]=='0'||s[i]=='5')
{
ans+=f2[i];
if(ans>=mod)ans-=mod;
}
int a=f2[len];
ans=(ll)ans*(mod_pow(a,k)-1)%mod*mod_pow(a-1,mod-2)%mod;
printf("%d\n",ans);
}
return 0;
}