【递推+矩阵快速幂+模运算+欧拉降幂】HDU - 5895 Mathematician QSC

矩阵快速幂 PPT中简单讲解了一下矩阵的基础,以及矩阵快速幂的写法和简单应用,练习题网上有很多 立即下载

HDU - 5895

解题思路

太难了搞了我整整一天,数论咋这么难

参考题解

1.累加法化简 g ( n ) g(n) g(n):

img

在看看g(n)的定义 g(n) = f(1)^2 + f(2)^2 + … + f(n)^2;

因为

img

所以:

img

多写几个就可以看出累加法:

img

所以:

img

2.矩阵快速幂求 f ( n ) f(n) f(n):

由
[ f ( 1 ) , f ( 0 ) ] × A n = [ f ( n + 1 ) , f ( n ) ] [f(1),f(0)] \times A^{n} = [f(n+1),f(n)] [f(1),f(0)]×An=[f(n+1),f(n)]
其中 f ( 1 ) = 1 , f ( 0 ) = 0 , f(1)=1, f(0)=0, f(1)=1,f(0)=0,
A = [ 2 1 1 0 ] A= \left[ \begin{matrix} 2 & 1\\ 1 & 0 \end{matrix} \right] A=[21​10​]
设结果矩阵为 r e s res res,则 f ( n + 1 ) = r e s [ 0 ] [ 0 ] , f ( n ) = r e s [ 0 ] [ 1 ] f(n+1)=res[0][0],f(n)=res[0][1] f(n+1)=res[0][0],f(n)=res[0][1]。

3.模运算的处理。

现在的式子化为: x g ( n ) % ( s + 1 ) = x f ( n ) × f ( n + 1 ) 2 % ( s + 1 ) x^{g(n)}\%(s+1)=x^{\frac {f(n) \times f(n+1)}{2}}\%(s+1) xg(n)%(s+1)=x2f(n)×f(n+1)​%(s+1)

涉及幂运算的取模,运用欧拉降幂公式的第三种情况
a b % p = { a b % ϕ ( p ) % p g c d ( a , p ) = 1 a b % p g c d ( a , p ) ≠ 1 , b < ϕ ( p ) a b % ϕ ( p ) + ϕ ( p ) % p g c d ( a , p ) ≠ 1 , b ≥ ϕ ( p ) a^b\%p=\left\{ \begin{aligned} &a^{b\%\phi(p)}\%p& \quad gcd(a,p)=1\\ &a^b\%p& \quad gcd(a,p) \neq1,b<\phi(p)\\ &a^{b\%\phi(p)+\phi(p)}\%p& \quad gcd(a,p) \neq1,b\ge\phi(p)\\ \end{aligned} \right . ab%p=⎩⎪⎪⎨⎪⎪⎧​​ab%ϕ(p)%pab%pab%ϕ(p)+ϕ(p)%p​gcd(a,p)=1gcd(a,p)​=1,b<ϕ(p)gcd(a,p)​=1,b≥ϕ(p)​
化为: x f ( n ) × f ( n + 1 ) 2 % ϕ ( s + 1 ) + ϕ ( s + 1 ) % ( s + 1 ) x^{\frac {f(n) \times f(n+1)}{2}\%\phi(s+1)+\phi(s+1)}\%(s+1) x2f(n)×f(n+1)​%ϕ(s+1)+ϕ(s+1)%(s+1)

单独求一个欧拉函数的板子:

LL phi(LL n) {
    LL res = n;
    for(int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            res = res - res / i;
            while (n % i == 0) n /= i;
        }
    }
    if (n > 1) res = res / n * (n - 1);
    return res;
}

不知道啥是欧拉函数戳这里,很详细~

单独拎出 x x x 的指数部分的前半部分看,要求 f ( n ) × f ( n + 1 ) 2 % ϕ ( s + 1 ) \frac {f(n) \times f(n+1)}{2}\%\phi(s+1) 2f(n)×f(n+1)​%ϕ(s+1)。

因为 2 2 2 和 ϕ ( s + 1 ) \phi(s+1) ϕ(s+1) 不一定互质,因此不能用乘法逆元求解。

正确做法是应用这个公式: a b % m o d = a % m o d × b b \frac ab\%mod=\frac {a\%mod\times b}{b} ba​%mod=ba%mod×b​

  • 证明:
    a b m o d    k = d a b = k x + d a = k b x + b d a m o d    k b = b d a m o d    k b b = d \frac ab\mod k = d \\ \frac ab=kx+d\\ a=kbx+bd\\ a\mod kb=bd\\ \frac {a \mod kb}{b}=d ba​modk=dba​=kx+da=kbx+bdamodkb=bdbamodkb​=d

因此 f ( n ) × f ( n + 1 ) 2 % ϕ ( s + 1 ) = f ( n ) × f ( n + 1 ) % 2 × ϕ ( s + 1 ) 2 \frac {f(n) \times f(n+1)}{2}\%\phi(s+1)= \frac {f(n) \times f(n+1) \%2 \times\phi(s+1)}{2} 2f(n)×f(n+1)​%ϕ(s+1)=2f(n)×f(n+1)%2×ϕ(s+1)​,可劲儿求吧。

注意事项

求 f ( n ) f(n) f(n) 的时候运用矩阵快速幂取模,注意此时的模不是 s + 1 s+1 s+1,而是 2 × ϕ ( s + 1 ) 2 \times\phi(s+1) 2×ϕ(s+1)。

参考代码

#include<stdio.h>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<set>
#include<stack>
//#define LOCAL  //提交时一定注释
#define VI vector<int>
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long LL;
typedef double db;
const int inf = 0x3f3f3f3f;
const LL INF = 1e18;
typedef vector<VI> mat;

inline int readint() {int x; scanf("%d", &x); return x;}

LL mod;

mat multi(mat &A, mat &B) {
    mat C(A.size(), VI(B[0].size()));
    for(int i = 0; i < A.size(); i++) {
        for(int j = 0; j < B.size(); j++) {
            for(int k = 0; k < B.size(); k++) {
                C[i][j] = (C[i][j] + 1LL * A[i][k] * B[k][j] % mod) % mod;
            }
        }
    }
    return C;
}

mat fm(mat A, LL n) {
    mat res(A.size(), VI(A.size()));
    for(int i = 0; i < A.size(); i++)
        res[i][i] = 1;
    while (n) {
        if (n & 1) res = multi(res, A);
        A = multi(A, A);
        n >>= 1;
    }
    return res;
}

LL phi(LL n) {
    LL res = n;
    for(int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            res = res - res / i;
            while (n % i == 0) n /= i;
        }
    }
    if (n > 1) res = res / n * (n - 1);
    return res;
}

LL qm(LL a, LL b, LL c) {
    LL res = 1;
    while (b) {
        if (b & 1) res = res * a % c;
        a = a * a % c;
        b >>= 1;
    }
    return res;
}

int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
//   freopen("output.txt", "w", stdout);
#endif
    int t = readint();
    mat A(2, VI(2)), B(1, VI(2));
    A[0][0] = 2;
    A[0][1] = A[1][0] = 1;
    B[0][0] = 1, B[0][1] = 0;
    LL n, y, x, s;
    mat res, A_n;
    while (t--) {
        scanf("%lld%lld%lld%lld", &n, &y, &x, &s);
        mod = 2 * phi(s + 1);
        A_n = fm(A, n * y);  //求A^n
        res = multi(B, A_n);
        LL mi = (res[0][0] % mod * res[0][1] % mod) % mod;
        mi = mi / 2 + mod / 2;
        printf("%lld\n", qm(x, mi, s + 1));
    }
    return 0;
}
基于CODESYS与EtherCAT的步进电机单轴控制实践 本文详细介绍了基于CODESYS平台与EtherCAT总线技术实现步进电机单轴控制的完整实践流程。从硬件选型、软件工程创建、EtherCAT主从站配置,到运动控制功能块编程与在线调试,手把手指导读者完成从零到一的搭建,并提供了常见问题的排坑指南,帮助自动化开发者快速掌握这一高效、灵活且成本可控的工业运动控制解决方案。 阅读详情

相关推荐

在虚拟机上搭建FTP服务器

chroot_list_file=/etc/vsftpd/chroot_list # 对chroot_list下用户限制。[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf #打开配置文件。# 指定用户的shell: -s /usr/bin/nologin。# 在配置文件中找到以下几行代码, 去掉注释(去掉 "#"号)# 指定用户主目录:/data/ftp/ftpuser -M。(2)修改配置文件,路径/etc/vsftpd/ 下的文件。

weixin_70753380的博客 3208

线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算

线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算

专注于人工智能的算法与应用 3813

win10自动修复-无限循环【通用完美】超简单解决办法

2020.02.14今个我的笔记本电脑(Thinkpad Carbon 7 X1)(win10)早晨起来发现蓝屏,上面显示自动修复失败,重启后依然自动修复失败,不断手动重启,始终是修复失败。然后上网开始搜集资料找解决办法。 前边介绍关闭自动修复,如何找出错文件的方法;如果想看最终解决办法,直接看第三部分 上网就会发现这种现象很常见,同时是电脑自动安装系统更新,或者安装某些驱动出现。解决办法也大...

y15941300574的博客 19万+

递推式子+矩阵快速幂+欧拉降幂

百度之星2022年题——离散数学。

cxm_yumu的博客 1561

代码审计工具学习之RISP(安装以及初步操作)

1 代码审计 1.1名词解释 代码审计(Code audit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。 它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。 C和C ++源代码是最常见的审计代码,因为许多高级语言(如Python)具有较少的潜在易受攻击的功能(例如,不检查边界的函数)。 顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过..

weixin_52515588的博客 1万+

研一脑电小白日记 之 EEGLAB预处理实战指南

本文为脑电研究新手提供了一份详尽的EEGLAB预处理实战指南。从MATLAB与EEGLAB环境搭建、使用NeuracleEEGFileReader插件导入BDF格式数据开始,逐步讲解了电极定位、滤波、降采样、ICA去伪迹等核心步骤,旨在帮助初学者高效完成脑电数据预处理,为后续分析奠定坚实基础。

weixin_29230649的博客 555

hdu3802 矩阵快速幂&特征方程&降幂

矩阵快速幂,特征方程,降幂公式

bigtiao097的博客 752

结构化数据特征构建神器openfe的实战代码

最近订阅专栏的几位同学一起参加了AI比赛,该比赛的数据形式是结构化的。随着特征和模型的不断迭代优化,达到了一个难以跨越的瓶颈。希望我能够给出一些有效的方法,帮助他们提高成绩。在个人的调研和体验后,向他们推荐了结构化数据特征构建神器openfe,最终也帮助他们提升了十来名的成绩,个人也感到十分的欣慰。特意写此博客,希望能够帮助更多的同学。 文章目录 1. 安装 2. 实战例子一 3. 实战例子二

herosunly的博客 3万+

组合数学基本

基础知识 先复习一下高中学的基础知识 A(m, n) = n!/(n-m)! 从n个元素中有顺序的取出m个元素。 C(m, n) = n!/(n-m)!m! 从n个元素中无顺序的取出m个元素。 高考选择题中小技巧有排除法,分类讨论法,插空法等。 醒脑小例题 有n个人围着桌子吃饭,请问有多少种排列方法?要是其中两个人不想坐在一起呢? 解:(1)有n!/n种排列方法,因为圆桌需要指定一个开始坐的起点...

HuaSir的博客 384

一种抑制undershoot/overshoot锐化算法介绍

一、USM 当增强图像的边缘、细节信息等高频信息时,图像的锐化视觉效果会得到较大提升。提高图像锐化的一种经典算法为非锐化掩码(UNsharp Masking)技术。该技术首先通过高通滤波并与缩放系数相乘,其结果再与原始图像相加,即可对高频信息进行增强。其主要的原理如下图所示: 其中,对图像进行高通滤波的另一种等效方法为:原始图像减去原始图像的低通滤波图像,其结果被称之为“掩码”。因此,上述的USM方法可以表示为: 原始图像减去原始图像低通滤波之后的图像得到掩码M。 2.掩...

大熊 4241

SPAD IMX479规格_分辨率

当然IMX479具备IMX459几乎全部的数字架构,但也有一个缺点就是贵,这个让头部的主机厂有些犹豫,毕竟大家都在集中火力想把车载LiDAR玩进千元机。如果用一片IMX479是不太可能实现千元内部的,当然国产也在奋起直追,特别在前面的几家SPAD厂商都具备开发IMX479的实力,但相对来说落地可能更是当下所考虑的,IMX479的迭代是基于IMX459,小编已经注意到国内有一两家已经在挑战479的规格了,如果国产SPAD没有大规模量产就直接流片IMX479的规格,可能就有点忽略市场的反馈闭环。

致力于lidar应用开发 2416

HDU 4382 【矩阵快速幂】【欧拉降幂】

排名赛

weixin_51546928的博客 402

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

hdu5895 Mathematician QSC(矩阵快速幂+逆元+降幂)

hdu5895题目求题目里的一个式子的值思路首先f(n)是可以通过矩阵递推得到的 其次,g(n)也可以归纳得出g(n)=f(n)*f(n+1)/2 对于x^(g(n*y))%(s+1),幂的次数太高,我们要用降幂公式 x^k%p=x^(k%phi(p)+phi(p))%p,其中phi是欧拉函数 但是对于这题,g(n)的表达式中有/2,所以我们需要求逆元, 但这个式子可能没有逆元,那么怎么做

天道酬勤 386

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)——2016 ACM/ICPC Asia Regional Shenyang Online

原文链接:http://blog.youkuaiyun.com/queuelovestack/article/details/52577212 解题思路: 【题意】 已知f(0)=0,f(1)=1,f(n)=f(n−2)+2∗f(n−1)(n≥2) 给你n,y,x,s的值 求的值 【类型】 矩阵乘法+循环节降幂+除法取模小技巧+快速幂 【分析】 一开始想简单了,对于a^x mod p这种形

633

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.youkuaiyun.com/queuelovestack/article/details/52577212 【分析】一开始想简单了,对于a^x mod p这种形式的直接用欧拉定理的数论定理降幂了 结果可想而知,肯定错,因为题目并没有保证gcd(x,s+1)=1,而欧拉定理的...

weixin_30587025的博客 161

HDU 5895 Mathematician QSC

矩阵快速幂,欧拉定理。 $g(n)$递推式:$g(n)=5g(n-1)+5g(n-2)-g(n-3)$,可以构造矩阵快速求递$n$项,指数很大,可以利用欧拉定理降幂。 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #inclu...

weixin_34361881的博客 94

单调栈(续)、由斐波那契数列讲述矩阵快速降幂技巧

在这里先接上一篇文章单调栈,这里还有单调栈的一道题。

KudouShinichi3的博客 1052

矩阵游戏 题解

婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储)。本题的问题是,n,m有10^1000000,分别用作乘数和次方,做为乘数的时候可以边计算边取余很方便,作为次方的时候据说可以使用欧拉降幂来减少次数,公式如下,推导建议自己搜搜这里借个公式。由于最终结果可能很大,你只需要输出F[n][m]除以1,000,000,007的余数。包含一个整数,表示F[n][m]除以1,000,000,007的余数。最后求出f[n + 1][1]解方程求出f[n][m]即可。

crisp_chifan的博客 329

常见的几种求模运算(mod)——加减乘、除的小费马定理、指数的欧拉降幂

在C/C++中,+,-的优先级低于/,*,%,而/,*,%优先级一样,所以就从左到右 1.乘法 我们在做题的时候,遇到(a*b)%c,由于可能a*b先计算的话,会超精度,所以我们可以这么转化 (a*b)%c = (a%c)*(b%c)%c   2.加法或减法 (a+b)%c =( (a%c)+(b%c) )%c   3.除法 我们一般遇到除法 (a/b)%MOD的时候,会将除法变...

Mikchy的博客 1万+

快速幂+矩阵快速幂+欧拉降幂

快速幂 对于一个非常大的数进行指数运算时,运算会很慢。 例如计算5195^{19}519时,直接算就是19个5相乘。快速幂则二进制分解19,得到10011,这时只需要计算3次就可得到答案 设置ans=1,tmp,top从10011的低位指向高位, 10011 5195^{19}519=510011(2)5^{10011(2)}510011(2)=51(2)5^{1(2)}51(2)∗*∗510(2...

weixin_43769146的博客 615

TZC 3012-Fibnacci Numbers(矩阵快速幂+降幂公式)

3012: Fibnacci Numbers 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 总提交: 199            测试通过:55 描述 The fibnacci numbers are as follows: f[1] = 1; f[2] = 2; f[n] = f[n - 1] + f[n - 2

信仰.的博客 928

牛客练习赛68 B 牛牛的算术 基础数学题 取模操作+累加累乘化简

链接:https://ac.nowcoder.com/acm/contest/7079/B 来源:牛客网 题目描述 牛牛最近学习了取模是什么 于是他看到了下面这一道题: 多次询问:每次询问包含一个正整数 nnn 要求你输出下列结果 ∏i=1n∑j=1i∑k=1ji×j×k\prod_{i=1}^n \sum_{j=1}^i \sum_{k=1}^j i\times j\times k∏i=1n​∑j=1i​∑k=1j​i×j×k 为了避免结果过大 只需要输出这个式子对 199999199999199999(

马角的逆袭的博客 856

累加法

前言 求通项公式题型中,如果给定条件最终可以转化为\(a_{n+1}-a_n=f(n)\)的形式,或者可以转化为\(a_n-a_{n-1}=f(n)\)的形式,则我们就可以考虑使用累加法求通项公式。 一、注意事项 ①由已知的原始表达式衍生出\(n-1\)个同结构的表达式,其前提条件为\(n\ge 2\),但是求和时只需要这\(n-1\)个表达式,不用原始表达式参与求和,等号左端累加消项的结果是...

weixin_34297300的博客 1957

数学连乘和累加运算符号_2020中考数学 初中数学有理数计算(干货)

初中数学有理数计算数学试卷发下来后,经常听到有同学这样说,“我就是太粗心”…然而,老师却回复了一句,“我不相信关于粗心的任何解释”!因为任何的粗心都是有清楚原因的…那么“计算粗心”的原因在哪里?答案是,往往我们在做计算题时一心二用或者是根本没有掌握该知识点。当一个“丰满”的计算题摆在我们面前时,很多同学是蒙的,面对题目没有明确的解题思路,然后就开始凭感觉发挥:“恩,把那个简单约分先约一下...

weixin_39605578的博客 4055

一个求累加和程序的求解过程

【题目】求f=1-1/2!+1/3!-...+1/9! 【本文结构】   看题目,有点难度(相对而言,熟悉编程后,这只是一个非常典型的问题)。将我带着大家把这个问题分解一下,由易到难解出来。   我们要经历的过程是:   (一)求f=1+2+...+9【很简单的问题】   (二)求f=1-2+3-4+...+9【在(一)的基础上,学习如何一正一负地累加】   (三)求f=1-1

迂者-贺利坚的专栏 1万+

HDU 5895 矩阵快速幂+欧拉降幂公式+指数循环节

题目链接:HDU5895 注意到题目的数据非常之大,并且递归之后求的指数幂非常之大,所以要先知道欧拉降幂公式: ,相当于想成了指数的循环节。 根据递推关系得到: 建立矩阵: 用矩阵快速幂求解出g(n*y),之后再利用快速幂取模求出最后的结果由于数据很大,过程中把数据开大,及时取模。AC代码:#include <cstdio> #include <cstring> #include<

风城 2117
上一篇: 模运算公式整理
下一篇: 【组合数+隔板法】2021牛客寒假算法基础集训营5 B 比武招亲(上)
️kcuL ytnelP
博客等级 码龄7年 36粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值