首页 > 其他分享 >2023.7.6做题笔记

2023.7.6做题笔记

时间:2023-07-06 19:33:52浏览次数:42  
标签:mm text LL 笔记 times 2023.7 bmatrix 做题 oplus1

数论

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

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

\[X_{n+1}=(aX_n+c) \bmod m \]

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

首先我们构造初始矩阵:\(\begin{bmatrix}X_{i-1} & c\end{bmatrix}\)

根据递推式我们可以知道

\[X_i=X_{i-1}\times a+c\times 1\\ c=X_{i-1}\times0+c \times1 \]

所以矩阵转移为

\[X_n=\begin{bmatrix} a & 0\\ 1 & 1 \end{bmatrix} \times\begin{bmatrix}X_{i-1} & c\end{bmatrix} \]

#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] 公交车路线

这道题其实我们也可以用 \(\text {dp}\) 来处理

我们设 \(f_{i,j}\) 为第 \(i\) 站在 \(j\) 次乘坐后到达的方案数

边界 \(f_{0,0}=1\)

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

\[f_{i,j}=f_{i-1,j-1}+f_{i-1,j+1} \]

我们发现每一个状态都至只与上一个状态有关,所以我们将数组可以压位为 \(f_{4,2}\)

我们分成 \(4\) 次状态转移

\[f_{0,t}=2\times f_{1,t \oplus1}\bmod1000 \enspace\text{因为A处的方案等于两边的方案相加} \]

\[f_{1,t}=(f_{0,t\oplus1}+f_{2,t\oplus1}) \]

\[f_{2,t}=(f_{1,t\oplus1}+f_{3,t\oplus1})\enspace\text{两个都是前面和后面的方案相加} \]

\[f_{3,t}=f_{2,t\oplus1}\enspace\text{D只能由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;
}

标签:mm,text,LL,笔记,times,2023.7,bmatrix,做题,oplus1
From: https://www.cnblogs.com/ljfyyds/p/17533144.html

相关文章

  • 【置顶】算法笔记目录
    1.图论dijkstra算法笔记2.树:树状数组算法笔记线段树算法笔记......
  • E14笔记本Ubuntu20.04桌面版系统开机一直转圈,无法启动
    问题描述:E14设备一直开机跑程序采集数据,持续两三天,然后发现无法连接,重启设备后无法启动进入系统排查解决:E14笔记本开机按ESC键,可以进到grub菜单进入grub菜单后,选择“AdvancedoptionsforUbuntu高级选项”——“recoverymode恢复模式”在“恢复模式”的菜单中,选择“ro......
  • padoc技巧笔记
    1.安装官网下载Pandoc-index免安装的版本再github上提供Releasepandoc3.1.4·jgm/pandoc2.使用方法2.1.入门参考官方入门教程Pandoc-Gettingstartedwithpandoc2.1.1.通过终端打开下载的压缩包解压,里面有pandoc.exe,这个程序是命令行工具,用cmd终端来运行。......
  • 【ChernoC++笔记】指针和引用
    指针【16】C++指针▶️指针的类型不影响指针的本质:任何type的指针都是保存着内存地址的整数(integer)。指针的type只用来使人更好理解。//一个最简单的void类型指针,储存内存地址0void*ptr=0;void*ptr=NULL;void*ptr=nullptr; //C++11//使ptr存储var的内存地......
  • 2023.7.6
    1//2023.7.6周四2//java流程控制3//scanner45publicstaticvoidmain(String[]args)6{7//next方式不能读取有空格的字符串89//创建一个扫描对象用于接收键盘数据10Scannerscanner=newScanner(System.in);1112S......
  • 2023.7.6
    学习java中的类面向对象与面向过程面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象:强调具备了功能的对象,以类/对象为最小单位类与对象的关系类:对一类事物的描述,是抽象的、概念上的定义对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)面向对象......
  • Python QT5 使用笔记[随意记]
    self.rkDialog.tableWidget.findItems() 是一个在Qt中用于在表格小部件(TableWidget)中查找匹配项的方法。它的作用是查找满足特定条件的单元格项,并返回一个包含这些项的列表。这个方法的用法如下: items=self.rkDialog.tableWidget.findItems(text,flags) 参数说明:......
  • SpringBoot笔记:SpringBoot启动参数配置
    springboot启动参数/usr/local/jdk/jdk1.8.0_261/bin/java-jar-server\ ##服务模式,linux默认是server模式,window默认是client参数-XX:+HeapDumpOnOutOfMemoryError\ ##当OOM发生时自动生成HeapDump文件-XX:HeapDumpPath=/usr/local/springboot_......
  • 莫比乌斯反演学习笔记
    狄利克雷卷积对于两个数论函数$f(x)$和$g(x)$,他们的卷积结果$h(x)$定义为$h(x)=\sum_{d|x}^{}f(d)g(\frac{x}{d})=\sum_{ab=x}^{}f(a)g(b) $即$h=f*g$满足交换律,结合律,分配律。莫比乌斯函数 $$\mu(n)=\left\{\begin{matrix}1 &n=1\\0 &n含有平方因子\\(-1......
  • 差分学习笔记与总结
    差分学习笔记与总结目录差分一维差分What背景\(b_1\)的值\(b_2\)的值\(b_3\)的值\(b_i\)的值怎么用作用1作用2模板例题link题目大意CODE二维差分What作用模板模板题题目大意CODE差分前置知识-前缀和一维差分What差分可理解为前缀和的逆运算前缀和背景现有数......