真难则反考虑从最终状态考虑起走,以此满足当前的块所放的位置
代码
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
#define int long long
#define mod 1000000007
#define maxn 1000005
int ksm(int x,int y)
{
int ans=1;
while(y)
{
if(y&1) ans=(ans*x)%mod;
y>>=1;
x=(x*x)%mod;
}
return ans;
}
int n,a[maxn];
main()
{
int i,j;
scanf("%lld",&n);
for(i=1;i<=n;i++) scanf("%lld",&a[i]);
int now=3;
int ans=0;
for(i=n;i>=1;i--){
if(a[i]==now) continue;
else{
ans=(ans+ksm(2,i-1))%mod;
now=6-a[i]-now;
}
}
cout<<ans;
}