\(\mathcal{Description}\)

  Link.

  给定一个长度为 \(n\) 的木板,木板上有 \(m\) 个标记点,第 \(i\) 个标记点距离木板左端点的距离为 \(x_i\),现在你需要在木板上放置一些不相交正方形,正方形需要满足:

  • 正方形的边长为整数。

  • 正方形底面需要紧贴木板。

  • 正方形不能超出木板,正方形要将所有的木板覆盖。

  • 标记点的位置不能是两个正方形的交界处。

  求所有合法放置方案的正方形面积的乘积之和。对 \(10^9+7\) 取模。

  \(n\le10^9\),\(m\le10^5\)。

\(\mathcal{Solution}\)

  嘛……有时候题意转换……就挺突然的 qwq。

你有 \(n\) 个空格排成一行,格子边缘可以放隔板,其中第一格左侧和最后一格右侧必须放,标记位置不能放。然后在每两块隔板间放两个不同色的小球,可以放同一个位置。求方案数。

  不难证明与原问题等价。我们来考虑这个新问题。

  令 \(f(i,0/1/2)\) 表示前 \(i\) 个位置放好球,其中最后一段区间已经放了 \(0/1/2\) 个球的方案数。转移:

  • 不放隔板:
\[\begin{aligned}
f(i,0)&=f(i-1,0)\\
f(i,1)&=f(i-1,1)+f(i-1,0)\\
f(i,2)&=f(i-1,2)+2f(i-1,1)+f(i-1,0)
\end{aligned}
\]
  • 放隔板:
\[f(i,0/1/2)=f(i-1,2)
\]

  实际上只需要“随便放”和“不放”两种选择,把状态写成列向量 \(\begin{bmatrix}f(i,0)\\f(i,1)\\f(i,2)\end{bmatrix}\),构造两种转移矩阵:

  • 不放:
\[A=\begin{bmatrix}
1&0&0\\
2&1&0\\
1&1&1
\end{bmatrix}
\]
  • 随便放:
\[B=\begin{bmatrix}
2&1&1\\
2&1&0\\
1&1&1
\end{bmatrix}
\]

  在相邻两个标记点之间矩阵快速幂加速 DP 即可。复杂度 \(\mathcal O(3^3m\log n)\)。

\(\mathcal{Code}\)

#include <cstdio>
#include <assert.h> typedef long long LL; const int MAXM = 1e5, MOD = 1e9 + 7;
int n, m; inline int add ( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline int mul ( LL a, const int b ) { return ( a *= b ) < MOD ? a : a % MOD; } inline int rint () {
int x = 0; char s = getchar ();
for ( ; s < '0' || '9' < s; s = getchar () );
for ( ; '0' <= s && s <= '9'; s = getchar () ) x = x * 10 + ( s ^ '0' );
return x;
} struct Matrix {
int n, m, mat[3][3];
Matrix (): n ( 0 ), m ( 0 ), mat {} {}
Matrix ( const int tn, const int tm ): n ( tn ), m ( tm ), mat {} {}
inline int* operator [] ( const int key ) { return mat[key]; }
inline Matrix operator * ( Matrix t ) {
assert ( m == t.n );
Matrix ret ( n, t.m );
for ( int i = 0; i < n; ++ i ) {
for ( int k = 0; k < m; ++ k ) {
for ( int j = 0; j < t.m; ++ j ) {
ret[i][j] = add ( ret[i][j], mul ( mat[i][k], t[k][j] ) );
}
}
}
return ret;
}
}; inline Matrix qkpow ( Matrix a, int b ) {
Matrix ret ( a.n, a.m );
for ( int i = 0; i < ret.n; ++ i ) ret[i][i] = 1;
for ( ; b; a = a * a, b >>= 1 ) if ( b & 1 ) ret = ret * a;
return ret;
} Matrix I ( 3, 1 ), A ( 3, 3 ), B ( 3, 3 ); inline void init () {
I[0][0] = 1;
A[0][0] = 1;
A[1][0] = 2, A[1][1] = 1;
A[2][0] = A[2][1] = A[2][2] = 1;
B = A, ++ B[0][0], ++ B[0][1], ++ B[0][2];
} int main () {
init ();
n = rint (), m = rint ();
int las = 0;
for ( int i = 1, x; i <= m; ++ i ) {
x = rint ();
I = A * qkpow ( B, x - las - 1 ) * I;
las = x;
} I = A * qkpow ( B, n - las - 1 ) * I;
printf ( "%d\n", I[2][0] );
return 0;
}

Solution -「AGC 013E」「AT 2371」Placing Squares的更多相关文章

  1. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  2. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  3. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  4. Android内存管理(4)*官方教程 含「高效内存的16条策略」 Managing Your App's Memory

    Managing Your App's Memory In this document How Android Manages Memory Sharing Memory Allocating and ...

  5. SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法

    用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ...

  6. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  7. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  8. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  9. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

随机推荐

  1. 详谈 Java工厂 --- 抽象工厂模式

    1.前言 感觉工厂模式都好鸡肋,还特别绕来绕去,当然,好处还是有的,将一些类似的业务都集成到工厂了, 不需要理会底层是怎么运行的,我只需要向调用工厂即可获取我要的结果,也不需要考虑工厂返回的东西类型, ...

  2. JWT原理及实现

    wt(JSON Web Tokens),是一种开发的行业标准 RFC 7519 ,用于安全的表示双方之间的声明.目前,jwt广泛应用在系统的用户认证方面,特别是现在前后端分离项目. 1. jwt认证流 ...

  3. 《剑指offer》面试题38. 字符串的排列

    问题描述 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" 输出:["abc ...

  4. 《剑指offer》面试题39. 数组中出现次数超过一半的数字

    问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, ...

  5. JavaScript 中BOM的常用操作

    JavaScript BOM操作 1.获取浏览器窗口尺寸 var width=window,innerWidth //获取可视窗口宽度 var height=window.innerHeight // ...

  6. 【记录一个问题】linux+opencv+cuvid解码1080P视频,当使用CUDA核函数的时候,必然崩溃

    崩溃的信息如下: 1 OpenCV(4.1.0-dev) Error: Gpu API call (invalid configuration argument) in videoDecPostPro ...

  7. 515. Find Largest Value in Each Tree Row

    You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ \ 5 3 ...

  8. VS2017:win32项目与win32控制台应用程序的转换方法

    原文:https://www.cnblogs.com/asuser/articles/12297251.html 刚开始使用VS2017新建项目工程时,有时把应用类型的工程建成控制台类型的工程,在编译 ...

  9. CSS基本语法(二)

    目录 CSS基本语法(二) 八.CSS复合选择器 1.后代选择器** 2.子选择器 3.并集选择器** 4.伪类选择器 链接伪类选择器 :focus伪类选择器 总结 九.CSS的元素显示样式 1.概念 ...

  10. gin中jsonp的用法

    package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { r := ...