2020年ccpc长春站D-Meaningless Sequence

在这里插入图片描述
首先引用一下大佬的博客
推一下为什么是这样的:
首先:当二进制是满1的话就是 ∑ i = 0 x a i = ( 1 + c ) n \sum_{i=0}^{x}a_{i} = (1+c)^{n} i=0xai=(1+c)n其中 n n n x x x的二进制位数,这个其实很容易就能看出来吧按我的思路说一下:相当于一共 n n n位在 n n n位取小于等于 n n n个1其实就是组合数 C n 0 ∗ c 0 + C n 1 ∗ c 1 + . . . + C n n ∗ c n = ( 1 + c ) n C_{n}^{0}*c^{0}+C_{n}^{1}*c^{1}+...+C_{n}^{n}*c^{n} = (1+c)^{n} Cn0c0+Cn1c1+...+Cnncn=(1+c)n也就是上面那个所以我们进而在满二进制为1的 x x x上+上1那么就是变成了一个 2 x + 1 2^{x+1} 2x+1的形式,求这个的话我们可以分为两种:

  1. 第一种就是二进制最高位为1,他就相当与多了一位为1,这样他就会导致次方数x+1(也就是选择放1的地方多了一个当然是在原基础上也就是不会大于那个极限值),也就是 c ∗ a n s c*ans cans(第一次出现ans为1)
  2. 第二种就是二进制最高位为0,那么他其实转化成了上一位满1的那种情况

所以总的就是这两种的和
在推广一下:直接就是上面那个吧。
其实就能看出递归式:

ans = (qpow(1+c,len-i-1)+c*ans%mod)%mod;

总的代码是这样的:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long mod=1e9+7;
ll qpow(ll a,ll b) {
    ll sum=1;
    while(b) {
        if(b&1) sum=sum*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return sum;
}
int main() {
    string str;
    cin>>str;
    ll c;
    cin>>c;
    ll sum=1;
    ll len=str.size();
    for(int i=len-1; i>=0; i--) {
        if(str[i]=='1')
            sum=(qpow(1+c,len-i-1)+c*sum%mod)%mod;
    }
    cout<<sum<<endl;
    return 0;
}

还有一种类型(第一开始理解的类型还没调对,可以看着这个理解上面那个):
另一种形式

长春部分总题解

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值