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;
}
原文地址:https://www.cnblogs.com/Carered/p/13951657.html