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<

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...