CCF CSP认证201409-5 拼图

耗尽温柔 提交于 2019-11-28 01:16:12

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!