AtCoder Beginner Contest 293 E - Geometric Progression 无法求逆元/数列通项
创始人
2024-06-02 03:42:42
0

传送门:ATcoder

题目描述:

Given integers A, X, and M,find ∑i=0X−1Ai\sum\limits_{i=0}^{X-1}Aii=0∑X−1​Ai,modulo M

输入:
1000000000 1000000000000 998244353
输出:
919667211

首先X的范围达到了1e121e121e12,所以O(X)O(X)O(X)的算法肯定是过不了的.

然后当时我赛时就想起来之前有一次我做过一道自幂的题目,然后对与一个数不断自幂取模来说,必存在一个循环节.这个我在上述链接中已经有详细证明+解释,此处就不在赘述了.然后我就基于循环节的想法去打这道题.复杂度应该是低于O(M)O(M)O(M)的.但是可能是因为取模运算比较慢,所以最后是TLE了.

然后现在讲一下正解.首先假设你没有像我一样sb的去用循环节去做这道题,那么你应该不难发现AiA^iAi是一个等比数列,那么原题就是一道等比数列求和的题目,那么你可能十分的激动直接开做,1−qX1−X\frac{1-q^X}{1-X}1−X1−qX​,分子只用快速幂可以解决,但是你会发现分母需要使用逆元,但是这个逆元可能是不存在的(可以证明,但是比较麻烦).所以不能直接求.

我们可以换一种想法就是将∑i=0X−1Ai\sum\limits_{i=0}^{X-1}Aii=0∑X−1​Ai看成是一个等比数列的一个通项,也就是设一个Ci=∑i=0X−1AiCi=\sum\limits_{i=0}^{X-1}AiCi=i=0∑X−1​Ai,可以显然的发现CiCiCi本身就是一个等比数列,所以我们现在的任务就是求出CX的值即可.我们可以发现Ci=C(i−1)∗A+1Ci=C(i-1)*A+1Ci=C(i−1)∗A+1对于这种数列题,可以使用矩阵来快速解决

考虑有
[Ci]=[A1]∗[Ci−11]\left[ \begin{matrix} Ci \end{matrix} \right]=\left[ \begin{matrix} A&1 \end{matrix} \right]*\left[ \begin{matrix} Ci-1 \\ 1 \end{matrix} \right][Ci​]=[A​1​]∗[Ci−11​]

但是为了满足矩阵乘法的正确性(行数相同),我们补充一下两边矩阵

[Ci1]=[A101]∗[Ci−11]\left[ \begin{matrix} Ci \\ 1\end{matrix} \right]=\left[ \begin{matrix} A&1 \\ 0 & 1 \end{matrix} \right]*\left[ \begin{matrix} Ci-1 \\ 1 \end{matrix} \right][Ci1​]=[A0​11​]∗[Ci−11​]

定义初始矩阵为C0=[01]C0=\left[ \begin{matrix} 0 \\ 1 \end{matrix} \right]C0=[01​]
那么C1=[A101]∗[01]C1=\left[ \begin{matrix} A & 1 \\ 0 & 1 \end{matrix} \right]*\left[ \begin{matrix} 0 \\ 1 \end{matrix} \right]C1=[A0​11​]∗[01​]

那么CX=[A101]x∗[01]CX=\left[ \begin{matrix} A & 1 \\ 0 & 1 \end{matrix} \right]^{x}*\left[ \begin{matrix} 0 \\ 1 \end{matrix} \right]CX=[A0​11​]x∗[01​]

然后我们直接使用矩阵快速幂来迅速解决这道题即可

下面是具体的代码部分:

#include 
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define int long long
#define maxn 1000000
const double eps=1e-8;
#define	int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
int Mod,A,X;
int ans[10][10],x[10][10],c[10][10];
void x_pow() {for(int i=0;i<2;i++) {for(int j=0;j<2;j++) {c[i][j]=x[i][j];x[i][j]=0;}}for(int i=0;i<2;i++) {for(int j=0;j<2;j++) {for(int k=0;k<2;k++) {x[i][j]=(x[i][j]+c[i][k]*c[k][j]%Mod)%Mod;}		}}
}
void ans_pow() {for(int i=0;i<2;i++) {for(int j=0;j<1;j++) {c[i][j]=ans[i][j];ans[i][j]=0;}}for(int i=0;i<2;i++) {for(int j=0;j<1;j++) {for(int k=0;k<2;k++) {ans[i][j]=(ans[i][j]+x[i][k]*c[k][j]%Mod)%Mod;}}}
}
void juzhen_qpow(int k) {while(k) {if(k&1) ans_pow();k>>=1;x_pow();}
}
signed main() {A=read(),X=read(),Mod=read();x[0][0]=A;x[0][1]=1;x[1][0]=0;x[1][1]=1;ans[0][0]=0;ans[1][0]=1;juzhen_qpow(X);cout<

相关内容

热门资讯

强对流天气预警:辽宁福建广东台... 转自:央视网央视网消息:据中国天气网消息,中央气象台7月5日18时继续发布强对流天气蓝色预警:  预...
【硅锰】矿强托底,硅锰稳中有进... 淡季之下,本周硅锰市场也显现出一定偏强态势,但自身还是较缺乏有效利多驱动,市场跟涨情绪谨慎(钢厂虽有...
金志文×李雪琴破次元联动!未知... 未知旅行音乐节官宣惊喜嘉宾金志文、李雪琴即将加盟7月13日演出“音乐+喜剧”破次元联动是硬核弹唱还是...
内蒙古大型绿氢项目撤销 (转自:能源知库)近日,据内蒙古包头市达茂旗发改委的文件显示,内蒙古基础设施开发建设有限公司风光制氢...
历史性时刻! 昨晚发生了很多大事,第一个是美国救市行动彻底开始了,川普正式签订了“大而美”法案,紧接着又传出,川普...
台风预警升级 “丹娜丝”将向台... 转自:央视网央视网消息:据中国天气网消息,中央气象台7月5日18时发布台风黄色预警:  今年第4号台...
7月5日起 国内航线燃油附加费... 转自:央视新闻  日前,多家航空公司宣布自2025年7月5日(含)起上调国内航线燃油附加费,国内航线...
一名中国公民确诊,中使馆紧急提... 据中国驻玻利维亚大使馆5日消息,近日,玻利维亚麻疹疫情加剧,确诊病例超过70例,主要集中在圣克鲁斯省...
先买后付:金融教育如何破除债务... 来源:世界经济论坛先买后付(BNPL)正在推动在线购物,金融教育必须跟上金融科技创新的步伐。图片来源...
特朗普:应对制裁,普京很“专业... 据俄罗斯卫星通讯社、塔斯社报道,美国总统特朗普当地时间4日称,俄方一直能够应对制裁,他还称俄罗斯总统...