2023.7.6做题笔记

数论

矩阵快速幂 [NOI2012] 随机数生成器

这道题递推公式已经给我们了

Xn+1=(aXn+c)modm

但是如果用这个递推式如果直接使用的会超时,所以我们用矩阵快速幂来优化

首先我们构造初始矩阵:[Xi1c]

根据递推式我们可以知道

Xi=Xi1×a+c×1

c=Xi1×0+c×1

所以矩阵转移为

[Xic00]=[Xi1c00]×[a011]

[Xnc00]=[X0c00]×[a011]n

#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 5; LL mod, go, c, x, n, g; struct node { LL m[N][N]; } a, mm; LL quick_mul(LL x, LL y) { long long ans = 0; while (y != 0) { if (y & 1) ans = (ans + x) % mod; y >>= 1; x = (x << 1) % mod; } return ans; } node Mul(node x, node y) { node c; for (int i = 1; i <= 2; i++) for (int j = 1; j <= 2; j++) c.m[i][j] = 0; for (int i = 1; i <= 2; i++) for (int j = 1; j <= 2; j++) for (int k = 1; k <= 2; k++) c.m[i][j] += quick_mul(x.m[i][k] % mod, y.m[k][j] % mod), c.m[i][j] %= mod; return c; } void qpow(LL p) { while (p) { if (p & 1) a = Mul(a, mm); mm = Mul(mm, mm); p >>= 1; } } int main() { cin >> mod >> go >> c >> x >> n >> g; memset(a.m, 0, sizeof(a.m)); memset(mm.m, 0, sizeof(mm.m)); a.m[1][1] = x, a.m[1][2] = c; mm.m[1][1] = go, mm.m[2][1] = mm.m[2][2] = 1; qpow(n); cout << a.m[1][1] % g; return 0; }

P2233 [HNOI2002] 公交车路线

这道题其实我们也可以用 dp 来处理

我们设 fi,j 为第 i 站在 j 次乘坐后到达的方案数

边界 f0,0=1

因为我们每次只能从相邻位置转移过来,所以转移方程为

fi,j=fi1,j1+fi1,j+1

我们发现每一个状态都至只与上一个状态有关,所以我们将数组可以压位为 f4,2

我们分成 4 次状态转移

f0,t=2×f1,t1mod1000因为A处的方案等于两边的方案相加

f1,t=(f0,t1+f2,t1)

f2,t=(f1,t1+f3,t1)两个都是前面和后面的方案相加

f3,t=f2,t1D只能由C来,因为到了E便不能回头

#include <bits/stdc++.h> using namespace std; inline int read() { int x = 0, f = 1; char s = getchar(); while (s < '0' || s > '9') { if (s == '-') f = -f; s = getchar(); } while (s >= '0' && s <= '9') { x = (x << 3) + (x << 1) + (s ^ 48); s = getchar(); } return x * f; } const int MOD = 1000; int f[4][2]; int n, t = 0; int main() { f[0][0] = 1; n = read(); for (int i = 1; i < n; i++) { t ^= 1; f[0][t] = 2 * f[1][t ^ 1] % MOD; f[1][t] = (f[0][t ^ 1] + f[2][t ^ 1]) % MOD; f[2][t] = (f[1][t ^ 1] + f[3][t ^ 1]) % MOD; f[3][t] = f[2][t ^ 1]; } cout << 2 * f[3][t] % MOD;//E由D和F来 return 0; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/17533144.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示