• (水题)Codeforces


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

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

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

    那么2的任意次方可以由快速幂求出来。除法可以用费马小定理求出来乘法逆元(这里的模数是质数,而不仅仅是与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
    ",ans);
    }
  • 相关阅读:
    接口
    java基础
    java的反射
    按照字典序打印所有的字符串
    求幂的问题
    时间复杂度与空间复杂度
    孩子们的游戏(圆圈中最后剩下的数)
    约瑟夫环问题
    翻转单词顺序列
    复杂链表的复制
  • 原文地址:https://www.cnblogs.com/Yinku/p/10285667.html
Copyright © 2020-2023  润新知