//模拟枚举+dp
//只要确定了第一位的1雷的个数,后面一的个数都是确定不变的,所以我们只需枚举第一位上雷的个数,通过dp就能得到最后结果
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=100000007;
int dp[10005];//dp[i]第i位上有几个1
int num[10005];//第i位上的雷的个数
void init(){
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
}
int main(){
int T;
cin>>T;
while(T--){
char s[10005];
scanf("%s",s);
int n=strlen(s);
for(int i=0;i<n;i++){
num[i+1]=s[i]-'0';
}
//dp[i]=num[i-1]-dp[i-1]-dp[i-2]
ll ans0=1,ans1=1,ans2=1;
//分别代表dp[1]=0,1,2时的个数
//分别讨论
dp[1]=0;
int k=1;
if(1){
for(int i=2;i<=n;i++){
//dp公式
dp[i]=num[i-1]-dp[i-1]-dp[i-2];
//超出范围就不合适
if(dp[i]<0||dp[i]>2){
k=0;break;
}
}
//符合条件就计算
if(num[n]==dp[n]+dp[n-1]&&k){
for(int i=1;i<=n;i++){
if(dp[i]==1)ans0*=2;
ans0%=mod;
}
}
else ans0=0;
}
dp[1]=1;k=1;
if(num[1]>=1){
for(int i=2;i<=n;i++){
dp[i]=num[i-1]-dp[i-1]-dp[i-2];
if(dp[i]<0||dp[i]>2){
k=0;break;
}
}
if(num[n]==dp[n]+dp[n-1]&&k){
for(int i=1;i<=n;i++){
if(dp[i]==1)ans1*=2;
ans1%=mod;
}
}
else ans1=0;
}
else {
ans1=0;
}
dp[1]=2;k=1;
if(num[1]>=2){
for(int i=2;i<=n;i++){
dp[i]=num[i-1]-dp[i-1]-dp[i-2];
if(dp[i]<0||dp[i]>2){
k=0;break;
}
}
if(num[n]==dp[n]+dp[n-1]&&k){
for(int i=1;i<=n;i++){
if(dp[i]==1)ans2*=2;
ans2%=mod;
}
}
else ans2=0;
}
else {
ans2=0;
}
printf("%lld\n",(ans0+ans1+ans2)%mod);
}
}
02-08
9086
