日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

# HDU - 6185 Covering

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 # 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。