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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Happy Necklace dp 递推 矩阵快速幂

發(fā)布時間:2025/3/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Happy Necklace dp 递推 矩阵快速幂 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  • 當(dāng)滿足素數(shù)2和素數(shù)3的條件后,下一個素數(shù)區(qū)間5乃至之后的都會被滿足。
  • 考慮能否從f[n - 1]轉(zhuǎn)換到f[n],考慮第i - 1位,如果后面加紅色一定滿足條件,所以f[n]先是加上f[n - 1]
  • 如果最后加藍(lán)色,上一位一定是紅色,且上上位也得是紅色
  • 所以f[n] = f[n - 1] + f[n - 3]
  • n的范圍太大,所以無法將遞推的結(jié)果保存起來,所以矩陣快速冪
#include <iostream> #include <cstring>using namespace std;typedef long long ll;const int N = 3; const ll mod = 1e9 + 7;ll n;void mul(ll c[], ll a[], ll b[][N]) {ll temp[N] = {0};for (int i = 0; i < N; i ++ )for (int j = 0; j < N; j ++ )temp[i] = (temp[i] + a[j] * b[j][i] % mod) % mod;memcpy(c, temp, sizeof temp); }void mul(ll c[][N], ll a[][N], ll b[][N]) {ll temp[N][N] = {0};for (int i = 0; i < N; i ++ )for (int j = 0; j < N; j ++ )for (int k = 0; k < N; k ++ )temp[i][j] = (temp[i][j] + a[i][k] * b[k][j] % mod) % mod;memcpy(c, temp, sizeof temp); }int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _;cin >> _;while (_ -- ){cin >> n;if (n == 2){cout << 3 << endl;continue;}if (n == 3){cout << 4 << endl;continue;}n -= 3;ll f1[N] = {4, 3, 2};ll a[N][N] = {{1, 1, 0},{0, 0, 1},{1, 0, 0}};// wa // ll a[N][N] = { // {1, 0, 1}, // {1, 0, 0}, // {0, 1, 0} // };while (n){if (n & 1) mul(f1, f1, a);mul(a, a, a);n >>= 1;}cout << f1[0] % mod << endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的Happy Necklace dp 递推 矩阵快速幂的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。