前言:看到这个题目,感觉有点像动态规划,因为数据量有点大,不可能去枚举所有的情况
我们定义 dp[ i ] 为以 a[ i ] 结尾的方案数,用变量qian 记录 i 之前的所有枚举的情况
如果 a[ i ] 是奇数,那么 qian = qian * 2 +1 ,这可以认为取与不取 a[ i ] ,这就有 qian * 2 种方案 , 还可以自己成为一个数,这就需要加上 1
如果是偶数,还需要分 0 和 非 0 ,如果是 0 ,dp[ i ] = 1 + qian , qian = qian *2 ,;
非 0 的话就是 dp[ i ] = 1 + qian , qian = qian * 2 +1
自己想出转移方程的感觉真好
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
const int N = (int)2e5+5;
const int Mod = (int)1e9+7;
int a[N];
int b[N];
int main(){
cin >> n ; cin >> s;
for(int i=0;i<n;i++){
a[i+1] = s[i] - '0';
}
int qian = 0;
int ans = 0;
for(int i=1;i<=n;i++){
if(a[i]==0){
ans += 1; // 加上自己
ans += qian;
qian = qian * 2 % Mod;
}else if((a[i]&1)==0){
ans += 1;
ans += qian;
qian = (qian*2+1) % Mod;
}else{
qian = (qian*2+1) % Mod;
}
ans %= Mod;
}
cout << ans;
return 0;
}