题意:
有一个长度为𝑛的数字字符串𝑆,该字符串仅包[0,9]的数字。
从中挑选出若干个字符,然后按照其相对顺序重新拼接而成一个数字,使其是一个无前导0的偶数。
例如:当𝑛=3,𝑆=100其包含的偶数数字有0,0,10,10,100而00是不符合条件的,因为其含有前导0。求方案数
用ans记录答案数,cnt记录前面能构成的数的个数
1.如果加入的数是0(偶数), 那么,ans = ans + cnt + 1, cnt * 2,
2.如果加入的数是偶数, 那么,ans + cnt + 1, cnt * 2 + 1
;
3. 如果加入的数是奇数, 那么, ans, cnt * 2 + 1
; (因为是奇数, ans保持原样即可)
为啥 cnt 要 *2 呢?
如果我们选了这个数,那么就有cnt个, 如果不选, 那么也是cnt个, 因此此时的cnt要 *2;
为啥cnt 要 +1 呢,
因为该数也可以作为一个单独的数字, 作为前面的数; 而如果是0的时候不能加1, 因为要保证没有前导0
const int mod = 1e9 + 7;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n; string s; cin >> n >> s;
int ans = 0, cnt = 0; //答案,前面可以构成数的个数
for(int i = 0; i < n; i ++)
{
if(s[i] == '0')
{
ans = (ans + cnt + 1) % mod;
cnt = cnt * 2 % mod;
}
else if((s[i] - '0') % 2 == 0) //偶数
{
ans = (ans + cnt + 1) % mod;
cnt = (cnt * 2 + 1) % mod;
}
else //奇数
cnt = (cnt * 2 + 1) % mod;
}
cout << ans << endl;
return 0;
}