【jzoj4787】【数格子】【 状态压缩动态规划】【矩阵快速幂】
2016-09-23 21:34
471 查看
题目大意
解题思路
显然状压dp,然而会tle,就想到矩阵快速幂。f[i][s]表示第i行摆放情况为s的方案数,显然可以把转移矩阵处理出来,然后就快速幂。
code
#include<set> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LF double #define LL long long #define max(a,b) ((a>b)?a:b) #define min(a,b) ((a>b)?b:a) #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const maxs=500000,inf=2147483647; LL n,m,a[20],b[20],c[20][20],ans[20][20],mat[20][20],sam[20][20]; void dfs(LL i,LL p){ if(p>4){ LL j=0; fd(k,4,1)j=j*2+b[k]; sam[i][j]++; return; } if(a[p]){ b[p]=0; dfs(i,p+1); }else{ if(a[p+1]){ b[p]=1; dfs(i,p+1); }else{ b[p]=1; dfs(i,p+1); b[p]=0;a[p+1]=1; dfs(i,p+1); a[p+1]=0; } } } void multam(){ fo(i,0,15) fo(j,0,15) c[i][j]=0; fo(i,0,15) fo(j,0,15) fo(k,0,15) c[i][k]=(c[i][k]+ans[i][j]*mat[j][k])%m; fo(i,0,15) fo(j,0,15) ans[i][j]=c[i][j]; } void multmm(){ fo(i,0,15) fo(j,0,15) c[i][j]=0; fo(i,0,15) fo(j,0,15) fo(k,0,15) c[i][k]=(c[i][k]+mat[i][j]*mat[j][k])%m; fo(i,0,15) fo(j,0,15) mat[i][j]=c[i][j]; } int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); a[5]=1; fo(i,0,15){ LL ii=i; fo(j,1,4){ a[j]=ii%2; ii/=2; } dfs(i,1); } for(scanf("%lld%lld",&n,&m);n||m;scanf("%lld%lld",&n,&m)){ fo(i,0,15) fo(j,0,15) mat[i][j]=sam[i][j],ans[i][j]=0; ans[1][0]=1; for(;n;){ if(n%2)multam(); multmm(); n/=2; } printf("%lld\n",ans[1][0]); } return 0; }
相关文章推荐
- 100道动态规划——31 POJ 2411 && POJ 2663 && POJ 3420 状态压缩 矩阵快速幂
- 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)
- 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)
- POJ 1185 炮兵阵地(动态规划+状态压缩)
- Poj-1185 & Nyoj-81 炮兵阵地 (状态压缩动态规划经典题
- 动态规划之状态压缩
- 状态压缩动态规划 -- 炮兵阵地
- 炮兵阵地(poj1185,状态压缩的动态规划)
- uva 11795 Mega Man's Mission(动态规划-状态压缩DP)
- 动态规划状态压缩题解
- 插头与轮廓线与基于连通性状态压缩的动态规划
- [ZOJ 3662] Math Magic (动态规划+状态压缩)
- 状态压缩动态规划 -- 旅行商问题
- [POJ 2923] Relocation (动态规划 状态压缩)
- 动态规划之状态压缩
- 状态压缩动态规划 -- 多米诺骨牌
- 状态压缩动态规划 -- 炮兵阵地
- 动态规划---状态压缩(即集合上的动态规划)
- POJ_3420_Quad Tiling_搜索,矩阵快速幂,状态压缩,动态规划
- POJ3254 Corn Fields 状态压缩动态规划,状压动规