201312-4有趣的数
#include <bits/stdc++.h> // 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。 //1.动态规划求解 //2.由题意可得最高位的数值是2 //3.以剩余为使用的元素作为基准开始进行动态规划的递推 //4.注意要在运算的过程中取余(在运算的过程中取余和得到最后的结果再取余的答案一样,但能适应存储) using namespace std; int main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); long long mod = 1000000007; long long int n; cin>>n; long long **states = new long long *[n+1]; for(long long i =0;i<n+1;++i) states[i] = new long long[6]; for(long long i=0;i<6;++i) states[0][i]=0; /* 0---剩下 013 1---剩下13 2---剩下01 3---剩下3 4---剩下1 5---无 */ for(long long i=1;i<=n;++i){ long long j=i-1; states[i][0] = 1; states[i][1] = (states[j][0]+states[j][1]*2)%mod; states[i][2] = (states[j][0]+states[j][2])%mod;//对于2状态已经有了3了,所以只能放2 states[i][3] = (states[j][1]+states[j][3]*2)%mod; states[i][4] = (states[j][1] + states[j][2]+states[j][4]*2)%mod; states[i][5] = (states[j][3] + states[j][4] + states[j][5]*2)%mod;//当2031已经凑全后,后面只能放1和3 } cout<<states[n][5]<<endl; return 0; }