这种题都要写好久,wtcl。
下文下标从 0 0 0 开始。 n n n 为原序列长度。
考虑
k
=
1
k=1
k=1 的情况,显然要以 0
或 5
结束,前面随便选多少个,后面全不选。若前面有
p
p
p 个数,方案数为
2
p
2^p
2p。
若 k ≠ 1 k\neq 1 k=1,设 m u l = ∑ i = 0 k − 1 2 i n mul = \sum\limits_{i=0}^{k-1}2^{in} mul=i=0∑k−12in,答案乘上 m u l mul mul 即可。
为什么呢?若原序列中第
p
p
p 位为 0
或 5
,那么总序列中它会出现在
p
,
p
+
n
,
p
+
2
n
,
.
.
.
,
p
+
(
k
−
1
)
n
p,p+n,p+2n,...,p+(k-1)n
p,p+n,p+2n,...,p+(k−1)n。总方案数显然为
2
p
+
2
p
+
n
+
.
.
.
+
2
p
+
(
k
−
1
)
n
2^p+2^{p+n}+...+2^{p+(k-1)n}
2p+2p+n+...+2p+(k−1)n,即
2
p
∗
m
u
l
2^p*mul
2p∗mul。
这里 k k k 很大, m u l mul mul 可以分治计算。设 f p f_p fp 表示 ∑ i = 0 p 2 i n \sum\limits_{i=0}^{p}2^{in} i=0∑p2in,则:
{ f p = f ( p − 1 ) / 2 ∗ 2 ( p + 1 ) / 2 ∗ n + 1 i f p ≡ 1 ( m o d 2 ) f p = f p − 1 + 2 p n i f p ≡ 0 ( m o d 2 ) \begin{cases} f_p=f_{(p-1)/2} * 2^{(p+1)/2*n} + 1&&if&p\equiv1(\bmod 2)\\ f_p=f_{p-1} + 2^{pn}&&if&p\equiv0(\bmod 2) \end{cases} {fp=f(p−1)/2∗2(p+1)/2∗n+1fp=fp−1+2pnififp≡1(mod2)p≡0(mod2)
最后 m u l mul mul 就是 f k − 1 f_{k-1} fk−1。
//CF327C
#include <cstring>
#include <cstdio>
typedef long long ll;
const int N = 1e5 + 10;
const ll P = 1e9 + 7;
ll mul, ans;
char s[N];
int k, n;
ll qp(ll a, ll b){
ll ans = 1;
while(b){
if(b&1){
ans = ans * a % P;
}
a = a * a % P;
b >>= 1;
}
return ans;
}
ll calc(ll k){
if(k == 0){
return 1;
}
if(k&1){
return calc(k/2) * (qp(2, ((k+1)/2)*n) + 1) % P;
} else {
return (calc(k-1) + qp(2, k*n)) % P;
}
}
int main(){
scanf("%s%d", s, &k);
n = strlen(s);
mul = calc(k-1);
for(int i = 0; i < n; ++ i){
if(s[i] == '0' || s[i] == '5'){
ans += qp(2, i);
ans %= P;
}
}
printf("%lld\n", ans * mul % P);
return 0;
}
111