• 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;
    }
    
  • 相关阅读:
    vertical-align
    剑指offer刷题
    ES6 promise
    wangyi准备
    spring定时器
    xshell下linux常用操作
    HSSFWorkbook生成excel文件
    梳理并分解继承体系
    JSON格式数据转换
    部署项目
  • 原文地址:https://www.cnblogs.com/Carered/p/13951657.html
Copyright © 2020-2023  润新知