生活随笔
收集整理的這篇文章主要介紹了
# HDU - 6185 Covering
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意
有一個4xN的土地,用2x1 和1x2兩種去無重疊覆蓋,問最多有多少種方案。
思路
最開始我以為是奇數和偶數分別討論,推出來的公式是(偶數) f[i] = f[2]^(i/2); (奇數)f[i] = 5 * f[i-1],推出來不久我就意識到好像貌似是錯的。然后暴力把前面的答案找到 1 5 11 36 95 ...,再者第一次推的時候也有部分是對的,所以容易得到一個線性方程
f[i] = f[i-1] +5*f[i-2]+f[i-3] -f[i-4];
第二個問題是數據很大,套了一個矩陣快速冪的模板。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const long long MOD = 1e9 + 7;
LL aaa[30] =
{1, 5, 1, -1, 0,1, 0, 0, 0, 0,0, 1, 0, 0, 0,0, 0, 1, 0, 0,0, 0, 0, 1, 0
};
struct matrix
{LL a[5][5];
};matrix mat_mul(matrix x, matrix y)
{matrix res;memset(res.a, 0, sizeof(res.a));for(int i = 0; i < 5; i++)for(int j = 0; j < 5; j++)for(int k = 0; k < 5; k++){res.a[i][j] += x.a[i][k] * y.a[k][j] ;res.a[i][j] =(res.a[i][j] %MOD + MOD) % MOD;}return res;
}matrix mat_pow(LL n)
{matrix c, res; // res = c ^ nint ind = 0;for(int i = 0; i < 5; i++)for(int j = 0; j < 5; j++)c.a[i][j] = aaa[ind++];memset(res.a, 0, sizeof(res.a));for(int i = 0; i < 5; i++)res.a[i][i] = 1;while(n){if(n & 1)res = mat_mul(res, c);c = mat_mul(c, c);n = n >> 1;}return res;
}
LL cc[6] = {1, 5, 11, 36, 95};
matrix ff ;
int main()
{for(int i = 0; i < 5; i ++)ff.a[4 - i][0] = cc[i];long long n;while(cin >> n){if(n > 5){matrix num = mat_pow(n - 5);matrix mum = mat_mul(num, ff);cout << mum.a[0][0] << endl;}elsecout << cc[n - 1] << endl;}return 0;
}
轉載于:https://www.cnblogs.com/cifiyoo/p/9491722.html
總結
以上是生活随笔為你收集整理的# HDU - 6185 Covering的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。