作为全场难度第三的题目,比赛的时候写出来了。。好高兴。。
枚举开头0的个数(1~6),算出结果*2
#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#define mod 2015
#define ll long long
using namespace std;
ll dp[100005][8][2];
int main(){
int t,cnt=0;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
printf("Case #%d: ",++cnt);
if(n<7){
cout<<pow(2.0,n)<<endl;
continue;
}
ll s=0;
for(int k=2;k<=7;++k){
memset(dp,0,sizeof(dp));
dp[k][1][1]=1;dp[k][1][0]=0;
for(int i=k+1;i<=n;++i){
for(int j=2;j<7;++j){
dp[i][j][0]=dp[i-1][j-1][0];
dp[i][j][1]=dp[i-1][j-1][1];
}
dp[i][1][0]=0;
dp[i][1][1]=0;
for(int j=1;j<7;++j){
dp[i][1][0]=(dp[i][1][0]+dp[i-1][j][1])%mod;
dp[i][1][1]=(dp[i][1][1]+dp[i-1][j][0])%mod;
}
}
for(int i=1;i<8-k;++i){
s=(s+dp[n][i][0])%mod;
}
for(int i=1;i<7;++i)
s=(s+dp[n][i][1])%mod;
}
cout<<s*2%mod<<endl;
}
return 0;
}