同余问题
1. 同余定义
给定整数 mmm ,若两个整数 a,ba,ba,b 除以 mmm 所得余数相同,称 aaa 和 bbb 对模 mmm 同余,表示为:a≡b( mod m)a ≡ b(\ mod \ m)a≡b( mod m)。
若一个整数集合中所有数模 mmm 的余数相同,这个集合中的数都称为模 mmm 的同余类。每个同余类中的任意两个整数对模 mmm 同余。
定理 111 : a≡b( mod m)a ≡ b(\ mod \ m)a≡b( mod m) ,当且仅当 m∣a−bm|a-bm∣a−b 。
证明:
设 rrr 为 a,ba,ba,b 模 mmm 的余数,所有可以得到 a=k1×m+r,b=k2×m+r,a−b=(k1−k2)×ma=k_1\times m+r,b=k_2\times m+r,a-b=(k_1-k_2)\times ma=k1×m+r,b=k2×m+r,a−b=(k1−k2)×m ,满足 m∣a−bm|a-bm∣a−b ,反之亦然。
定理 222 :a≡b( mod m)a ≡ b(\ mod \ m)a≡b( mod m) ,当且仅当存在整数 kkk ,使得 a=b+k×ma=b+k\times ma=b+k×m 。
证明:
与定理 111 类似,a=k1×m+r,b=k2×m+r,a+k2×m+r=k1×m+r+ba=k_1\times m+r,b=k_2\times m+r,a+k_2\times m+r=k_1\times m+r+ba=k1×m+r,b=k2×m+r,a+k2×m+r=k1×m+r+b ,即 a=b+(k1−k2)×m=b+k×ma=b+(k_1-k_2)\times m=b+k\times ma=b+(k1−k2)×m=b+k×m 。
2. 同余有关定理
(1)欧拉定理
若正整数 a,na,na,n 互质,则:aφ(n)≡1( mod n)a^{\varphi(n)}≡1(\ mod \ n)aφ(n)≡1( mod n),φ(n)\varphi(n)φ(n) 为欧拉函数,表示 1∼n1 \sim n1∼n 中和 nnn 互质的数的个数。
证明:
1∼n1 \sim n1∼n 中,与 nnn 互质的数有 φ(n)\varphi(n)φ(n) 个,设 x1,x2,x3……xφ(n)x_1,x_2,x_3……x_{\varphi(n)}x1,x2,x3……xφ(n) 是 1∼n−11\sim n-11∼n−1 中与 nnn 互质的数。再设一个集合 M={ax1,ax2,ax3……axφ(n)}M=\{ ax_1,ax_2,ax_3……ax_{\varphi(n)}\}M={ax1,ax2,ax3……axφ(n)} 。下面,我们证明两个推理:
推论一:MMM 中任意两个数模 nnn 不同余。
反证法:
如果存在两个数同余,则axp≡axq(mod n)ax_p≡ax_q(mod \ n)axp≡axq(mod n) ,则 n∣(axp−axq)n| (ax_p-ax_q)n∣(axp−axq) ,因为 aaa 和 nnn 互质,(xp−xq)<n(x_p-x_q)<n(xp−xq)<n,所以 nnn 不可能整除 axp−axqax_p-ax_qaxp−axq ,所以不存在两个数同余,证毕。
推论二:MMM 中的数模 nnn 的余数 (axi mod n)(ax_i \ mod \ n)(axi mod n) 全部与 nnn 互质
证明:
aaa 与 nnn 互质,xix_ixi 与 nnn 互质,所以可得 axiax_iaxi 与 nnn 互质,带入到欧几里得算法中:gcd(axi,n)=gcd(n,axi mod n)=1gcd(ax_i,n)=gcd(n,ax_i \ mod \ n)=1gcd(axi,n)=gcd(n,axi mod n)=1 ,证毕。
根据以上两个推论,就可以进行推式子了。根据推论知道,MMM 中的任意两个数模 nnn 不同余且与 nnn 互质,x1,x2,x3……xφ(n)x_1,x_2,x_3……x_{\varphi(n)}x1,x2,x3……xφ(n) 也与 nnn 互质,模 nnn 不同余,那么它们模 nnn 的余数是相互对应的,可以得到:
ax1×ax2×ax3……×axφ(n)≡x1×x2×x3×……×xφ(n)(mod n)ax_1\times ax_2\times ax_3……\times ax_{\varphi(n)}≡x_1\times x_2\times x_3\times ……\times x_{\varphi(n)} (mod \ n)ax1×ax2×ax3……×axφ(n)≡x1×x2×x3×……×xφ(n)(mod n)
则:aφ(n)(x1×x2×x3×……×xφ(n))≡x1×x2×x3×……×xφ(n)(mod n)a^{\varphi(n)}(x_1\times x_2\times x_3\times ……\times x_{\varphi(n)}) ≡x_1\times x_2\times x_3\times ……\times x_{\varphi(n)} (mod \ n)aφ(n)(x1×x2×x3×……×xφ(n))≡x1×x2×x3×……×xφ(n)(mod n)
移项可得:(aφ(n)−1)(x1×x2×x3×……×xφ(n))≡0(mod n)(a^{\varphi(n)}-1)(x_1\times x_2\times x_3\times ……\times x_{\varphi(n)}) ≡0 (mod \ n)(aφ(n)−1)(x1×x2×x3×……×xφ(n))≡0(mod n)
所以 aφ(n)≡1(mod n)a^{\varphi(n)}≡1(mod \ n)aφ(n)≡1(mod n)。
(2)费马小定理
若 ppp 是质数,对于任意整数 aaa ,则:ap≡a(mod p)a^p≡a(mod \ p)ap≡a(mod p) 。
证明:
可用欧拉定理定理证明,若 a,pa,pa,p 互质,aφ(p)≡1(mod p)a^{φ(p)}≡1(mod \ p)aφ(p)≡1(mod p) ,质数 ppp 的欧拉函数φ(p)=p−1\varphi(p)=p-1φ(p)=p−1,所以 ap−1≡1(mod p)a^{p-1}≡1(mod \ p)ap−1≡1(mod p),两边同时乘以 aaa ,则 ap≡a(modp)a^p≡a(mod p)ap≡a(modp) ;若 a,pa,pa,p 不互质,因为 ppp 是质数,则 aaa 一定是 ppp 的倍数,ap≡a≡0(mod p)a^p≡a≡0(mod \ p)ap≡a≡0(mod p)。其实,费马小定理算是欧拉定理的一个特例。
(3)欧拉定理的推论
若正整数 a,na,na,n 互质,那么对于任意正整数 bbb ,有:ab≡ab mod φ(n)(mod n)a^b≡a^{b \ mod \ φ(n)}(mod \ n)ab≡ab mod φ(n)(mod n) 。
证明:
设 b=q×φ(n)+rb=q\times φ(n)+rb=q×φ(n)+r,其中 0≤r<φ(n)0\leq r<φ(n)0≤r<φ(n) ,即 r=b mod φ(n)r=b \ mod \ φ(n)r=b mod φ(n)。
于是 ab≡aq×φ(n)+r≡(aφ(n))q×ar≡1q×ar≡ab mod φ(n)(mod n)a^b ≡ a^{q\times φ(n)+r}≡(a^{φ(n)})^q\times a^r≡1^q\times a^r≡a^{b \ mod \ φ(n)}(mod \ n )ab≡aq×φ(n)+r≡(aφ(n))q×ar≡1q×ar≡ab mod φ(n)(mod n) 。
许多计数类的题目要求把答案对一个质数 PPP 取模,可以先将底数对 PPP 取模,指数对 $ φ§ (φ§=P-1)$取模,将计算的规模缩小。
特别的,当 a,na,na,n 不一定互质且 b>φ(n)b> φ(n)b>φ(n) 时,有 ab≡ab mod φ(n)+φ(n)(mod n)a^b≡a^{b \ mod \ φ(n)+φ(n)}(mod \ n)ab≡ab mod φ(n)+φ(n)(mod n),可自行证明。
3. 同余性质
对于整数 a,b,c,da,b,c,da,b,c,d 和自然数 mmm ,对模 mmm 同余满足:
(1)对称性:若 a≡b(mod m)a≡b(mod\ m)a≡b(mod m) ,则 b≡a(mod m)b≡a(mod \ m)b≡a(mod m) 。
(2)传递性:若 a≡b(mod m)a≡b(mod \ m)a≡b(mod m) ,b≡c(mod m)b≡c(mod \ m)b≡c(mod m) ,则 a≡c(mod m)a≡c(mod \ m)a≡c(mod m) 。
(3)同加性:若 a≡b(mod m)a≡b(mod \ m)a≡b(mod m) ,则 a+c≡b+c(mod m)a+c≡b+c(mod \ m)a+c≡b+c(mod m) 。
(4)同乘性:若 a≡b(mod m)a≡b(mod \ m)a≡b(mod m) ,则 ac≡bc(mod m)ac≡bc(mod \ m)ac≡bc(mod m)。
a≡b(mod m)a≡b(mod \ m)a≡b(mod m) ,c≡d(mod m)c≡d(mod \ m)c≡d(mod m) ,则 ac≡bd(mod m)ac≡bd(mod \ m)ac≡bd(mod m)。
(5)同幂性: 若 a≡b(mod m)a≡b(mod\ m)a≡b(mod m),则 ac≡bc(mod m)ac≡bc(mod \ m)ac≡bc(mod m)。
注意,同余不满足同除性,即不满足,若 a≡b(mod m)a≡b(mod\ m)a≡b(mod m) ,则 ac≡bc(mod m)\frac a c≡\frac b c(mod \ m)ca≡cb(mod m) 。
4.扩展欧几里得算法
裴蜀定理
对于任意自然数 a,ba,ba,b ,存在整数 x,yx,yx,y 满足 ax+by=gcd(a,b)ax + by = gcd(a,b)ax+by=gcd(a,b) 。
证明:
当 b=0b=0b=0 时,存在一组整数解 x=1,y=0x=1,y=0x=1,y=0 ,使得 a×1+b×0=gcd(a,0)=aa\times 1+b\times 0=gcd(a,0)=aa×1+b×0=gcd(a,0)=a 。
当 b≠0b \not =0b=0 时, 根据欧几里得算法,求解 gcd(a,b)gcd(a,b)gcd(a,b) ,可以递归求解 gcd(b,a % b)gcd(b,a\ \% \ b)gcd(b,a % b) ,带入到方程 ax+by=gcd(a,b)ax + by = gcd(a,b)ax+by=gcd(a,b) 。
假设存在一组解 x1,y1x_1,y_1x1,y1 ,满足 bx1+(a%b)y1=gcd(b,a%b)=gcd(a,b)bx_1+(a \%b)y_1=gcd(b,a\%b)=gcd(a,b)bx1+(a%b)y1=gcd(b,a%b)=gcd(a,b),
展开后为:bx1+(a−ab×b)y1=gcd(b,a%b)bx_1+(a-\frac a b\times b)y_1=gcd(b,a\%b)bx1+(a−ba×b)y1=gcd(b,a%b) ,此处的 ab\frac a bba 为整除。合并后有:ay1+b(x1−ab×y1)=gcd(b,a%b)ay_1+b(x_1-\frac a b \times y_1)=gcd(b,a\%b)ay1+b(x1−ba×y1)=gcd(b,a%b) 。
ax+by=gcd(a,b)ax + by = gcd(a,b)ax+by=gcd(a,b)
ay1+b(x1−ab×y1)=gcd(b,a%b)ay_1+b(x_1-\frac a b \times y_1)=gcd(b,a\%b)ay1+b(x1−ba×y1)=gcd(b,a%b)
gcd(a,b)=gcd(b,a % b)gcd(a,b)=gcd(b,a\ \% \ b)gcd(a,b)=gcd(b,a % b)
由以上三个式子可以得到:x=y1,y=x1−ab×y1x=y_1,y=x_1-\frac a b \times y_1x=y1,y=x1−ba×y1 。
因此,求解 x,yx,yx,y,可以通过x1,y1x_1,y_1x1,y1 求解。欧几里得算法本身就是递归的过程,x1,y1x_1,y_1x1,y1 可以通过 x2,y2x_2,y_2x2,y2 求解…,递归边界为 b=0b=0b=0 , 此时存在解为 xi=1,yi=0x_i=1,y_i=0xi=1,yi=0,递归返回时则可以依次求解,最后得到 x,yx,yx,y 的解。
裴蜀定理是按欧几里得算法证明的,同时给出了解的计算方法,这种方法称为扩展欧几里得算法。求得的解为一组特解,存在多组解。
【参考程序】
int exgcd( int a, int b, int &x, int &y) //扩展欧几里得算法,&为引用
{ if (b==0) { x=1; y=0; return a; }
int d=exgcd( b, a%b, x, y);
int t=x; //递归返回,此时x,y保存的为下一层的值
x=y; //更新当前层新的x
y=t-a/d*y; //更新当前层新的y
return d; //可以同时求解最大公约数
}
5. 扩展欧几里得算法的应用
(1)求解不定方程 ax+by=cax+by=cax+by=c
对于不定方程 ax+by=cax+by=cax+by=c,当且仅当 gcd(a,b)∣cgcd(a,b)|cgcd(a,b)∣c 时,方程有整数解。
设 d=gcd(a,b)d=gcd(a,b)d=gcd(a,b),通过扩展欧几里得算法可以求得:ax1+by1=dax_1+by_1=dax1+by1=d 的一组特解: x1,y1x_1,y_1x1,y1 。
方程两边同时乘以 cd\frac c ddc ,可以得到不定方程 ax+by=cax+by=cax+by=c 的一组特解:x=cdx1,y=cdy1x=\frac c d x_1 , y=\frac c d y_1x=dcx1,y=dcy1 。
不定方程 ax+by=cax+by=cax+by=c 通解可以表示为:
x=cdx1+tbd,y=cdy1−tadx=\frac c dx_1 +t \frac b d ,y=\frac c d y_1-t\frac a dx=dcx1+tdb,y=dcy1−tda ( ttt 为整数),可以将通解带入到方程中进行验证。
当不满足 gcd(a,b)∣cgcd(a,b)|cgcd(a,b)∣c 时,无解。
通常题目要求最小正整数解,如果特解为 xxx ,则最小正整数解 =((x%bd)+bd)%bd=((x\%\frac b d)+\frac b d)\%\frac b d=((x%db)+db)%db,因为求出的特解可能为负数,需要加 bd\frac b ddb ,如果不是负数,则还需要模一次。yyy 的求解方法类似。
【例1】青蛙的约会(POJ 1061)
【问题描述】
两只青蛙住在同一条纬度线上,于是它们约定各自朝对方跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。
我们把这两只青蛙分别叫做青蛙 AAA 和青蛙 BBB ,并且规定纬度线上东经 000 度处为原点,由东往西为正方向,单位长度 111 米,这样我们就得到了一条首尾相接的数轴。设青蛙 AAA 的出发点坐标是 xxx ,青蛙 BBB 的出发点坐标是 yyy 。青蛙 AAA 一次能跳 mmm 米,青蛙 BBB 一次能跳 nnn米,两只青蛙跳一次所花费的时间相同。纬度线总长 LLL 米。现在要你求出它们跳了几次以后才会碰面。
【输入格式】
输入只包括一行 555 个整数 x,y,m,n,Lx,y,m,n,Lx,y,m,n,L,其中 x≠y<2000000000,0<m、n<2000000000,0<L<2100000000x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000x=y<2000000000,0<m、n<2000000000,0<L<2100000000。
【输出格式】
输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行 "Impossible""Impossible""Impossible" 。
【样例输入】
1 2 3 4 5
【样例输出】
4
【算法分析】
设一共跳了 TTT 步,则青蛙 AAA 最后的位置在 (x+mT) mod L(x+mT)\ mod \ L(x+mT) mod L ,青蛙 BBB 最后的位置在 (y+nT) mod L(y+nT)\ mod \ L(y+nT) mod L ,青蛙 AAA 和青蛙 BBB 相遇,则 x+mT≡y+nT( mod L)x+mT≡y+nT(\ mod \ L)x+mT≡y+nT( mod L) ,可得到不定方程:(x+mT)+kL=y+nT(x+mT)+kL=y+nT(x+mT)+kL=y+nT ,kkk 为整数。(转换方法参考同余,定理2)
移项可得:(n−m)T+kL=x−y(n-m)T+kL=x-y(n−m)T+kL=x−y,其中 T,kT,kT,k 是整数且未知。这就是标准的不定方程。
题目要求求最小的正整数解 TTT 。
【参考程序】
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll x,y,n,m,L;
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0) {x=1;y=0;return a;}
ll d=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return d;
}
int main()
{
ll a,b,d;
cin>>x>>y>>m>>n>>L;
if(n<m) {swap(m,n);swap(x,y);} //保证n-m>0
d=exgcd(n-m,L,a,b); //特解为a,b,原方程特解为a*(x-y)/d
if((x-y)%d!=0||m==n) cout<<"Impossible\n";
else
cout<<((a*(x-y)/d)%(L/d)+(L/d))%(L/d) <<endl;
return 0;
}
(2)求解线性同余方程 ax≡b( mod m)ax≡b(\ mod \ m)ax≡b( mod m)
给定整数 a,b,ma,b,ma,b,m ,求一个整数 xxx 满足 ax≡b( mod m)ax≡b(\ mod\ m)ax≡b( mod m) ,或者给出无解。因为未知指数为 111 ,所有称为一次同余方程,也称线性同余方程。
ax≡b( mod m)ax≡b(\ mod\ m)ax≡b( mod m) 等价于 ax−bax-bax−b 是 mmm 的倍数,不妨设为 −y-y−y 倍。于是,该方程可以改写为:ax+my=bax+my=bax+my=b 。
按照扩展欧几里得算法求解方程 ax+my=bax+my=bax+my=b 即可。
【例2】同余方程(NOIP 2012 提高)
【问题描述】
求关于 xxx 同余方程 ax≡1( mod b)ax ≡ 1 (\ mod \ b)ax≡1( mod b) 的最小正整数解。
【输入格式】
输入只有一行,包含两个正整数 a,ba, ba,b,用 一个 空格隔开。
【输出格式】
输出只有一行包含一个正整数 x0x_0x0,即最小正整数解,输入数据保证一定有解。
【样例输入】
3 10
【样例输出】
7
【数据范围】
对于 40%40\%40% 的数据, 2≤b≤1,0002 ≤b≤ 1,0002≤b≤1,000 ;
对于 60%60\%60% 的数据, 2≤b≤50,000,0002 ≤b≤ 50,000,0002≤b≤50,000,000
对于 100%100\%100% 的数据, 2≤a,b≤2,000,000,0002 ≤a, b≤ 2,000,000,0002≤a,b≤2,000,000,000
【算法分析】
同余方程 ax≡1( mod b)ax ≡ 1 (\ mod \ b)ax≡1( mod b) 可改写为 ax+by=1ax+by=1ax+by=1 ,使用扩展欧几里得算法求解。
(3)乘法逆元
若整数 a,pa,pa,p 互质,gcd(a,p)=1gcd(a,p)=1gcd(a,p)=1 ,ax≡1(mod p)ax≡1(mod \ p)ax≡1(mod p) ,称 aaa 关于模 ppp 的乘法逆元为 xxx 。如 4x≡1(mod 5)4x≡1(mod \ 5)4x≡1(mod 5),(4×9)%5=1(4\times 9)\%5=1(4×9)%5=1,$9 $ 为 444 模 555 的乘法逆元。
有了乘法逆元,就能解决除法取模的问题了。
求解 ab%p\frac a b \%pba%p(ppp 为质数),因为ab≡ab( mod p)\frac a b ≡\frac a b(\ mod \ p)ba≡ba( mod p),bx≡1(mod p)bx≡1(mod \ p)bx≡1(mod p) (xxx 为 bbb 模 ppp 的乘法逆元),所以:ab×bx≡ab×1(mod p)\frac a b \times bx≡\frac a b \times 1(mod \ p)ba×bx≡ba×1(mod p) 。
即:ax≡ab(mod p)ax≡\frac a b (mod \ p)ax≡ba(mod p)
因此,对于 aaa 除以 bbb 取模,等价于 aaa 乘以 bbb 模 ppp 的乘法逆元再取模。就可以分别计算 a%pa\%pa%p ,x%px\%px%p ,最后相乘再 %p\%p%p 。前提是 b,pb,pb,p 互质。
乘法逆元可以通过费马小定理和扩展欧几里得算法求解。
费马小定理
若 ppp 是质数,对于任意整数 aaa ,则:ap≡a(mod p)a^p≡a(mod \ p)ap≡a(mod p),那么 a(ap−1−1)≡0(mod p)a(a^{p-1}-1)≡0(mod \ p)a(ap−1−1)≡0(mod p),即 ap−1≡1(mod p)a^{p-1}≡1(mod \ p)ap−1≡1(mod p),那么 a×ap−2≡1(mod p)a\times a^{p-2}≡1(mod \ p)a×ap−2≡1(mod p) ,ap−2a^{p-2}ap−2 就是 aaa 模 ppp 的乘法逆元。
扩展欧几里得算法
ax≡1(mod p)ax≡1(mod \ p)ax≡1(mod p) 的解其实就相当于寻找方程 a∗x+p∗y=1a*x+p*y=1a∗x+p∗y=1 的解,而 a,pa,pa,p 互质,gcd(a,p)=1gcd(a,p)=1gcd(a,p)=1 ,刚好就是扩展欧几里得算法的标准形式。
【例3】Sumdiv(POJ 1845)
【问题描述】
给定两个自然数 AAA 和 BBB ,SSS 为 ABA^BAB 的所有正整数约数和,编程输出S mod 9901S \ mod \ 9901S mod 9901 的结果。
【输入格式】
只有一行,两个用空格隔开的自然数 AAA 和 BBB(0≤A,B≤50000000)(0\leq A,B\leq 50000000)(0≤A,B≤50000000)。
【输出格式】
只有一行,即 S mod 9901S \ mod \ 9901S mod 9901 的结果。
【样例输入】
2 3
【样例输出】
15
【算法分析】
根据唯一分解定理,任何一个大于 111 的自然数都能分解成有限个质数相乘的形式,即 AB=p1a1×B×p2a2×B×...×pkak×BA^B=p_1^{a_1\times B}\times p_2^{a_2\times B} \times ... \times p_k^{a_k\times B}AB=p1a1×B×p2a2×B×...×pkak×B 。所以 ABA^BAB 的所有约数和 sum=(1+p1+p12+...+p1a1×B)×(1+p2+p22+...+p2a2×B)×...×(1+pk+pk2+...+pkak×B)sum=(1+p_1+p_1^2+...+p_1^{a_1\times B})\times (1+p_2+p_2^2+...+p_2^{a_2\times B})\times ...\times (1+p_k+p_k^2+...+p_k^{a_k\times B})sum=(1+p1+p12+...+p1a1×B)×(1+p2+p22+...+p2a2×B)×...×(1+pk+pk2+...+pkak×B) 。
方法一:快速幂+乘法逆元
对于每一个 (1+pi+pi2+...+piai)(1+p_i+p_i^2+...+p_i^{a_i})(1+pi+pi2+...+piai) ,这是一个标准的等比数列,根据等比数列求和公式,可以得出和为 piai+1−1pi−1\frac {p_i^{a_i+1}-1} {p_i-1}pi−1piai+1−1 ,再 mod 9901\ mod \ 9901 mod 9901 。分子可以使用快速幂求解,分子除以分母取模,转换为分子乘以分母的乘法逆元取模。
使用乘法逆元时,需要满足 pi−1p_i-1pi−1 与 990199019901 互质,因为 990199019901 是质数,只可能存在 pi−1p_i-1pi−1 是 990199019901 的倍数,此时不能使用乘法逆元,但是可以知道 pi mod 9901=1p_i \ mod \ 9901=1pi mod 9901=1 ,则等比数列可以直接求解: (1+pi+pi2+...+piai) mod 9901=1+1+1...+1=ai+1(1+p_i+p_i^2+...+p_i^{a_i}) \ mod \ 9901=1+1+1...+1=a_i+1(1+pi+pi2+...+piai) mod 9901=1+1+1...+1=ai+1 。
方法二:分治
对于等比数列 (1+pi+pi2+...+piai)(1+p_i+p_i^2+...+p_i^{a_i})(1+pi+pi2+...+piai) ,
当 aia_iai 为奇数时,1+pi+pi2+...+piai=(1+pai2+1)×(1+pi+...+piai2)1+p_i+p_i^2+...+p_i^{a_i}=(1+p^{\frac {a_i} 2 +1})\times (1+p_i+...+p_i^{\frac {a_i} 2})1+pi+pi2+...+piai=(1+p2ai+1)×(1+pi+...+pi2ai)
展开后就有:(1+pi+...+piai2)+(pai2+1+pai2+2+pai2+1+...+pai)(1+p_i+...+p_i^{\frac {a_i} 2})+(p^{\frac {a_i} 2 +1}+p^{\frac {a_i} 2 +2}+p^{\frac {a_i} 2 +1}+...+p^{a_i })(1+pi+...+pi2ai)+(p2ai+1+p2ai+2+p2ai+1+...+pai),因为 aia_iai 为奇数,所以 piai2+ai2+1=piaip_i^{\frac {a_i} 2+\frac {a_i} 2+1}=p_i^{a_i}pi2ai+2ai+1=piai .
当 aia_iai 为偶数时,1+pi+pi2+...+piai=(1+pai2)×(1+pi+...+piai2)1+p_i+p_i^2+...+p_i^{a_i}=(1+p^{\frac {a_i} 2})\times (1+p_i+...+p_i^{\frac {a_i} 2})1+pi+pi2+...+piai=(1+p2ai)×(1+pi+...+pi2ai)
可以通过分治的方法,递归求解等比数列。
因此,等比数列求和可以使用快速幂+乘法逆元的方法,也可以使用分治的方法。

2373

被折叠的 条评论
为什么被折叠?



