http://codeforces.com/problemset/problem/327/C
等比求和相加,有mod的出现,所以要算逆元。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define LL long long #define MOD 1000000007 using namespace std; char s[100005]; int k; LL p_mod(LL a,LL b,LL c) { LL ans = 1; a = a%c; while(b > 0) { if(b%2 == 1) ans = (ans*a)%c; b /= 2; a = (a*a)%c; } return ans; } LL get_inv(LL a,LL c) { return p_mod(a,c-2,c); } int main() { scanf("%s%d",s,&k); LL ans = 0; int len = strlen(s); LL x = p_mod(2,len,MOD); LL y = get_inv(x-1,MOD); x = p_mod(x,k,MOD)-1; LL z = 0; for(int i = 0;i < len;i++) { if(s[i] == ‘0‘ || s[i] == ‘5‘) { z = (z+p_mod(2,i,MOD))%MOD; } } ans = (((z*x)%MOD*y)%MOD)%MOD; printf("%I64d\n",ans); return 0; }
时间: 2024-10-13 15:02:57