201409-5 拼图
生活随笔
收集整理的這篇文章主要介紹了
201409-5 拼图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
七十分超時代碼,具體思路可以仿照acwing蒙德里安的夢想
就是枚舉第i層放 a ,第i-1層放b的合法方案其中b和a都是同一塊;
100 分矩陣快速冪
#include <iostream> #include <algorithm> #include <cstring> #include <sstream> using namespace std; typedef long long LL; const int N = 5e5 + 4, mod = 1e9 + 7, M = 1<<7;LL n; int m, c[M][M], tem[M][M], res[M][M]; int dp[3][M];void multi(int a[][M], int b[][M], int n) {memset(tem, 0, sizeof tem); for(int i = 0;i < n;i ++)for(int j = 0;j < n;j ++)for(int k = 0;k < n;k ++)tem[i][j] = (tem[i][j] + (LL)a[i][k]*b[k][j])%mod;for(int i = 0;i < n;i ++)for(int j = 0;j < n;j ++)a[i][j] = tem[i][j]; }void pow(int a[][M], LL n) {memset(res, 0, sizeof res);for(int i = 0;i < 1<<m;i ++)res[i][i] = 1;while(n){if(n&1) multi(res, a, 1<<m);multi(a, a, 1<<m);n>>=1;} }void dfs(int a, int b, int p) {if(p == m) c[a][((1<<m)-1)^b]++; // 方便 矩陣快速冪 這題c[i][j]代表第二層是i 第一層是i的合法方案的其他空缺; else{if(p > 0){if(!((a>>p&1)||(b>>p&1)||(b>>p-1&1)))dfs(a|1<<p, b|1<<p|1<<p-1, p+1);if(!((a>>p&1)||(b>>p&1)||(a>>p-1&1)))dfs(a|1<<p|1<<p-1, b|1<<p, p+1);}if(p+1 != m){if(!((a>>p&1)||(b>>p&1)||(b>>p+1&1)))dfs(a|1<<p, b|1<<p|1<<p+1, p+1);if(!((a>>p&1)||(b>>p&1)||(a>>p+1&1)))dfs(a|1<<p|1<<p+1, b|1<<p, p+1);}dfs(a, b, p+1);} }int main() {scanf("%lld%d", &n, &m);dfs(0, 0, 0);for(int i = 0;i < 1<<m;i ++)dp[1][i] = c[i][0];if(n >= 2)pow(c, n-2); for(int i = 0;i < 1<<m;i ++)dp[2][(1<<m)-1] = (dp[2][(1<<m)-1] + (LL)res[(1<<m)-1][i]*dp[1][i])%mod;cout<<dp[2][(1<<m)-1];return 0; }總結
以上是生活随笔為你收集整理的201409-5 拼图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS 之FishHook原理及例子
- 下一篇: 201609-5 祭坛