蓝桥杯ACwing习题

题目 :https://www.acwing.com/problem/content/4409/

解析 :根据题目我们可以知道 问的是方案数 那么首先就想到了 dp 仔细想一下 发现类似于蒙德里安的梦想那道状态压缩的题 , 所以我们先考虑怎么定义 f[i][j] 
f[i][j] 表示的是 已经放了前 i 行 且第 i + 1 填满了  j 个格子 , 由此我们画图可以知道

f[i][0] = f[i - 1][2 ] + f[i - 1][0]
f[i][1] = f[i - 1][1]  + f[i - 1][0] * 2;
f[i][2] =  f[i - 1][0] +f[i - 1][1];

矩阵用于解决大数据问题

设Fi = { fi0 , fi1 , fi2};
Fi -1= { fi - 10 , fi - 11 , fi - 12}:
Fi- 1 * A  = Fi
由上面的可以得到 
A = 1 2 1
        0 1 1
        1 0  0
代码
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e7 + 10 , mod = 1e9 + 7;
typedef long long LL;

int dp[N][3]; // 已经放好了前 i 列 , 且第 i + 1 列放了 0 1 2 个的方案数 

void mul(LL f[] , LL a[] , LL b[][3])
{
       LL temp[3] = {0};
    
    for(int i = 0 ; i < 3 ; i ++)
      for(int j = 0 ; j < 3 ; j ++)
          temp[i] = (temp[i] + a[j] * b[j][i]) % mod;
          
    memcpy(f , temp ,sizeof temp);
}

void mul(LL a[3][3] , LL b[3][3] , LL c[3][3])
{
    LL temp[3][3] = {0};
    
    for (int i = 0; i < 3 ; i ++)
       for (int j = 0; j < 3 ; j ++)
         for (int k = 0; k < 3 ; k ++)
            temp[i][j] = (temp[i][j] + a[i][k] * b[k][j]) % mod;
    
    memcpy(a , temp , sizeof temp);
}

int main()
{
    int n;
    cin >> n;
    
    // 求 dp[n][0] ?
    n --;
    LL a[][3] =  { { 1, 2, 1 },
                  { 0 ,1 ,1 },
                  { 1,0 ,0 }};
                
    LL f[] = {1 , 2 , 1};
    
    while (n)
    {
        if(n & 1) mul(f , f , a);
          n >>= 1;
        mul(a , a , a);
      
    }
    
    cout << f[0] << endl;
    
    return 0;
}
 

相关推荐

  1. ACwing习题

    2023-12-08 16:04:05       51 阅读
  2. ACwing习题

    2023-12-08 16:04:05       46 阅读
  3. ACwing习题

    2023-12-08 16:04:05       48 阅读
  4. ACwing习题

    2023-12-08 16:04:05       51 阅读
  5. ACwing习题

    2023-12-08 16:04:05       47 阅读
  6. ACwing习题

    2023-12-08 16:04:05       52 阅读
  7. Acwing2024日期问题

    2023-12-08 16:04:05       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 16:04:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 16:04:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 16:04:05       82 阅读
  4. Python语言-面向对象

    2023-12-08 16:04:05       91 阅读

热门阅读

  1. Ubuntu下载离线包、安装离线包(dpkg)

    2023-12-08 16:04:05       73 阅读
  2. Ubuntu 在线 安装 Docker

    2023-12-08 16:04:05       56 阅读
  3. ubuntu22.04 怎么开启SSH服务

    2023-12-08 16:04:05       53 阅读
  4. R语言中如何改变表格数据的填充顺序

    2023-12-08 16:04:05       59 阅读
  5. [Python系列] 文字转语音

    2023-12-08 16:04:05       72 阅读