Solution -「AGC 013E」「AT 2371」Placing Squares
Link.
给定一个长度为 的木板,木板上有 个标记点,第 个标记点距离木板左端点的距离为 ,现在你需要在木板上放置一些不相交正方形,正方形需要满足:
-
正方形的边长为整数。
-
正方形底面需要紧贴木板。
-
正方形不能超出木板,正方形要将所有的木板覆盖。
-
标记点的位置不能是两个正方形的交界处。
求所有合法放置方案的正方形面积的乘积之和。对 取模。
,。
嘛……有时候题意转换……就挺突然的 qwq。
你有 个空格排成一行,格子边缘可以放隔板,其中第一格左侧和最后一格右侧必须放,标记位置不能放。然后在每两块隔板间放两个不同色的小球,可以放同一个位置。求方案数。
不难证明与原问题等价。我们来考虑这个新问题。
令 表示前 个位置放好球,其中最后一段区间已经放了 个球的方案数。转移:
- 不放隔板:
- 放隔板:
实际上只需要“随便放”和“不放”两种选择,把状态写成列向量 ,构造两种转移矩阵:
- 不放:
- 随便放:
在相邻两个标记点之间矩阵快速幂加速 DP 即可。复杂度 。
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现