• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

(水题)Codeforces-327C-MagicFive

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

因为答案可以有前导零,所以0和5一视同仁。每个小节内,以排在第 $i$ 个的5为结尾的序列即为在前面 $0\thicksim 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\n",ans);
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++:运算符重载发布时间:2022-07-13
下一篇:
C#中的协变(Covariance)和逆变(Contravariance)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap