2020 China Collegiate Programming Contest Changchun Onsite D. Meaningless Sequence

题目链接

https://codeforces.com/gym/102832/problem/D

题意

给定\(a_n\) 递推式,求\(0-n\)项和。

思路

找个规律如下图

\(sum[i]\) 表示前\(2^{i} - 1\)项和的答案,由图可知 \(sum[i] = sum[i - 1] * c + sum[i - 1]\)
对于二进制最高位的1,直接统计贡献即可, 对于后面的 1,考虑前面1的个数,贡献应乘以 \(c^{前面1的个数}\)并且要减去 0 的贡献。
特判 \(n == 0\)的情况

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 50;
const int mod = 1e9 + 7;
ll sum[maxn];
int main()
{
    std::ios::sync_with_stdio(false);
    string s;
    ll c;
    cin >> s >> c;
    sum[0] = 1;
    for(int i = 1;i < maxn;i++)
        sum[i] = sum[i - 1] * c % mod + sum[i - 1], sum[i] %= mod;
    ll cnt = 1, ans = 0, add = 0;
    int len = s.size();
    for(int i = 0;i < len;i++){
        if(s[i] == '1'){
            int pos = len - i;
            ans += (sum[pos - 1] - add + c) * cnt % mod, ans %= mod;
            cnt = (cnt * c) % mod;
            add = 1;
        }
    }
    if(!add) ans = 1;
    cout << ans << endl;
    return 0;
}
posted @ 2020-11-09 23:29  Carered  阅读(451)  评论(0编辑  收藏  举报