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;
}
标签:Onsite,Sequence,int,sum,Contest,add,ans,ll,mod 来源: https://www.cnblogs.com/Carered/p/13951657.html