//原题解 https://blog.csdn.net/qq_44096896/article/details/104149743
//题目链接 https://atcoder.jp/contests/abc129/tasks/abc129_e
题解代码:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=2e5+5;
char s[maxn];
int main()
{
scanf("%s",s+1);
ll a=1,b=0;//a记录的是前几位和s相同的数量,b记录的是不同的
int l=strlen(s+1);//他一共有三种情况,两种,一个是0,一个是1,一种,都是0;
for(int i=1;i<=l;i++)
{
if(s[i]=='1')//如果为1,那么对于a,两种情况,一个是1,一个是0
//对于b,他有两种情况,一种是有原来的b,后面跟着那三种情况再加上a的情况后面跟上0
{
b=b*3+a;
b%=mod;
a=a*2%mod;
}
else//如果为0,那么,a只有一种情况,对于b,后面三种情况都可以
{
b*=3;
b%=mod;
}
}
printf("%lld\n",(a+b)%mod);
return 0;
}
问:1、b=b*3+a;为什么吧b要乘三;
2、a、b是存储什么的(原题解看不懂)