Problem - 327C - Codeforces

https://codeforces.com/problemset/problem/327/C

因为答案可以有前导零,所以0和5一视同仁。每个小节内,以排在第i个的5为结尾的序列即为在前面0~i-1共i个里面选0、1、2直到i-1个去除,由二项式定理知道这里是2i

因为小节可以循环,每次循环后面的对应位置要多n个元素可以去除,那么就多乘一个2n,而一共有k节,由等比数列求和a1(1-qn)/(1-q)得知其实就是(2nk-1)/(2n-1)。

那么2的任意次方可以由快速幂求出来。除法可以用费马小定理求出来(所求数的p-2次方)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll p=1000000007;
ll qpow(ll x,ll n){
    ll res=1;
    while(n){
        if(n&1)
            res=res*x%p;
        x=x*x%p;
        n>>=1;
    }
    return res;
}

char a[100005];
ll k;
int main(){
    scanf("%s",a);
    scanf("%lld",&k);
    ll n=strlen(a);

    ll cur=0;
    for(int i=0;i<n;i++){
        if(a[i]=='5'||a[i]=='0'){
            cur+=qpow(2,i);
            cur%=p;
        }
    }

    ll ans=cur*(qpow(2,n*k)-1)%p*(qpow(qpow(2,n)-1,p-2))%p;
    printf("%lld\n",ans);
}

猜你喜欢

转载自www.cnblogs.com/Yinku/p/10285667.html
今日推荐