201409-5 拼图
题目
思路
菜鸟只能混分,听大佬们说要用状态压缩DP。
混分代码(20分)
//看作以2*3的矩形填充
#include<cstdio>
const int M=1e9+7;
long long n,m;
long long dp[1001]={1,0};
long long mypow(long long a,int b){//快速幂
if(a==1) return b;
long long temp=mypow(a/2,b);
if(a%2) return temp*temp*b%M;
else return temp*temp%M;
}
long long CalDp(int x){//b==6的时候dp
if(x==0) return 1;
if(x==1||x<0) return 0;
if(dp[x]) return dp[x];
return dp[x]=(CalDp(x-2)*4+CalDp(x-3)*8)%M;
}
long long dfs(long long a,int b){//按b的大小分情况dfs
if(a<2||b<2) return 0;
if(b==2) return mypow(a/3,2);
if(b==3) return mypow(a/2,2);
if(b==4) return dfs(a,b/2)*dfs(a,b-b/2)*(b%2+1)%M;
if(b==5) return mypow(a/6,64);
if(b==6) {
if(a<6||a==7) return dfs(b,a);
if(a>1000) return dfs(a/2,b)*dfs(a-a/2,b)*(a%2+1)%M;
return CalDp(a);
}
if(b==7) return mypow(a/6,128*3);
}
int main(){
scanf("%lld%lld",&n,&m);
if(n*m%6) {//总面积应该必须是6的倍数
printf("0\n");
return 0;
}
printf("%lld\n",dfs(n,m));
return 0;
}
来源:https://blog.csdn.net/weixin_43944910/article/details/99877376