title: 同余和GCD
date: 2019-07-26 16:14:56
tags: 数论
一、模运算
a除以m的余数 r,r=a mod m=a%m
0≤r≤m-1,一定存在 a=km+r,k=⌊a/m⌋
a%m的正负由被除数a决定,与m无关,eg. 7%4=3,-7%4=-3
二、同余
-
同余
(1) 给定一 个正整数 m和两个整数 a和b,如果 ((a-b)mod m)=0 ,则称 a和b模m同余,记为a≡b(mod m)
(2) ((a-b)mod m)=0 当且仅当存在整数k,a=b+km
eg. -7≡-3≡1≡5≡9(mod 4) -5≡-1≡3≡7≡11(mod 4)
-
同余类
整数被正整数 m除后,余数有m种情形:0、1、2、…、m-1,他们彼此之间余数不同
按模m是否同余对整数集进行分类,可以将整数集分成m个两两不相交的子集
我们把所有模m同余的整数构成的一个集合,叫做模m的一个同余类(剩余类)
整数集合根据对 模 m的同余关系 ,可以构造整数集合的一个划分
对给定的模 m运算,整数的同余关系是一个等价关系
集合A中元素间的关系"~"是等价关系,当其满足三个条件:
1.自反性:对于任意a∈A,都有a~a
2.对称性:对于a,b∈A,若ab,则有ba
3.传递性:对于a,b,c∈A,若ab,bc,则有a~c
-
完全剩余系、简化剩余系
完全剩余系:对于正整数m,有 r 0 , r 1 , r 2 , . . . , r m − 1 r_0,r_1,r_2,...,r_{m-1} r0,r1,r2,...,rm−1个同余类,且两两模m不同余,这些同余类所组成的集合叫做模m的完全剩余系
简化剩余系:对于模m的完全剩余系,从中选出与m互素 (gcd(r,m)==1咯)的同余类元素,且这些元素模m两两不同余,组成模m的一个简化剩余系
简化剩余系中同余类的个数为欧拉函数φ(m)
简化剩余系关于模m乘法封闭:
证明:若有a,b(0≤a,b<m),且GCD(a,m)=GCD(b,m)=1,因为a,b与m都没有相同的因子,所以a * b也没有相同的因子,所以a * b与m互质,所以a * b mod m也属于m的简化剩余系
-
带模运算的性质
-
同余的性质
三、快速幂
用于快速计算 a b a^b ab ,时间复杂度为 O ( l o g 2 b ) O(log_2\ b) O(log2 b)
用于a和b比较大的情况,常用的快速幂是 带模快速幂
eg.要求 3 15 3^{15} 315:
15 = ( 1111 ) 2 15=(1111)_2 15=(1111)2
3 1 = 3 , 3 2 = 9 , 3 4 = 81 , 3 8 = 6561 3^1=3,3^2=9,3^4=81,3^8=6561 31=3,32=9,34=81,38=6561
3 15 = 3 1 ∗ 3 2 ∗ 3 4 ∗ 3 8 3^{15}=3^1 * 3^2 * 3^4 * 3^8 315=31∗32∗34∗38
对于给定的整数b,其二进制数长度为 l o g 2 b log_2\ b log2 b
int quick_pow(int a,int b,int p)
{
int res=1%p;//一定要注意要这样初始化
while(b)
{
if(b&1)
res=res*1ll*a%p;
a=a*1ll*a%p;
b>>=1;
}
return res;
}
四、等比数列求和
S n = a + a 2 + . . . + a n S_n=a+a^2+...+a^n Sn=a+a2+...+an,求 S n % p S_n \%\ p Sn% p
直接用公式计算可能会溢出,应该用二分法进行递归求解
(1)如果n为偶数
S n = a + a 2 + . . . + a n 2 + a n 2 + 1 + a n 2 + 2 + . . . + a n S_n=a+a^2+...+a^{\frac{n}{2}}+a^{\frac{n}{2}+1}+a^{\frac{n}{2}+2}+...+a^n Sn=a+a2+...+a2n+a2n+1+a2n+2+...+an
=
(
a
+
a
2
+
.
.
.
+
a
n
2
)
+
a
n
2
(
a
+
a
2
+
.
.
.
+
a
n
2
)
=\left(a+a^2+...+a^{\frac{n}{2}} \right) +a^{\frac{n}{2}}\left(a+a^2+...+a^{\frac{n}{2}} \right)
=(a+a2+...+a2n)+a2n(a+a2+...+a2n)
=
S
n
2
+
a
n
2
S
n
2
=S_{\frac{n}{2}}+a^{\frac{n}{2}}S_{\frac{n}{2}}
=S2n+a2nS2n
= ( 1 + a n 2 ) S n 2 =\left( 1+a^{\frac{n}{2}}\right) S_{\frac{n}{2}} =(1+a2n)S2n
(2)如果n为奇数
S n = a + a 2 + . . . + a n − 1 2 + a n − 1 2 + 1 + a n − 1 2 + 2 + . . . + a n − 1 + a n S_n=a+a^2+...+a^{\frac{n-1}{2}}+a^{\frac{n-1}{2}+1}+a^{\frac{n-1}{2}+2}+...+a^{n-1}+a^n Sn=a+a2+...+a2n−1+a2n−1+1+a2n−1+2+...+an−1+an
= S n − 1 2 + a n − 1 2 S n − 1 2 + a n =S_{\frac{n-1}{2}}+a^{\frac{n-1}{2}}S_{\frac{n-1}{2}}+a^n =S2n−1+a2n−1S2n−1+an
= ( 1 + a n − 1 2 ) S n − 1 2 + a n =\left( 1+a^{\frac{n-1}{2}}\right) S_{\frac{n-1}{2}}+a^n =(1+a2n−1)S2n−1+an
五、最大公因数(Greatest Common Divisor,GCD)
两个或多个整数共有约数中最大的一个
欧几里得算法(辗转相除法)
如果 d和r是a除以 b的商和余数,那么 a和b的最大公因数等于 b和r的最大公因数,即GCD(a,b)=GCD(b,a%b)
非零数和0的最大公因式为那个非零数,eg. 5 和 0的最大公因数为5
- 两条线段长分别可表示 252和 105,则其中每一小分段长代表最大公约数21。如动画所示,只要辗转地从大数中减去小数,直到其中一段的长度为0,此时剩下的一条线段的长度就是252和105的最大公因数。
- 最初的绿色矩形的长和宽分别是a = 1071、b = 462,从中不断铺上462×462的正方形直到剩下部分面积是462×147;然后再铺上147×147的正方形直至剩下21×147的面积;最后,铺上21×21的正方形时,绿色部分就没有了。即21是1071和462的最大公约数。
//递归版
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
//非递归版
int gcd(int a,int b)
{
while(b>0)
{
int r=a%b;
a=b;
b=r;
}
return a;
}
注意:
GCD递归层数最多4.785 lg N+1.6723,N=max(a,b),所以一般不会栈溢出
lg是以10为底的对数函数
值得一提的是,GCD函数的递归层数最多的是 G C D ( F n , F n − 1 ) GCD(F_n,F_{n-1}) GCD(Fn,Fn−1), F n F_n Fn为Fibonacci数
???为啥,我也不造啊,书上就这么写的
如果GCD(a,b)=1,则两个整数a,b互质
证明 GCD(a,b)=GCD(b,a%b)
(1)证明GCD(a,b)是b,a%b的一个公约数
设GCD(a,b)=d,则 a=k1 *d,b=k2 *d
a%b=a-k * b → a%b=k1 * d - k * k2 *d →a%b=(k1-k * k2)*d
所以a%b和 b都有约数d,所以是“一个公约数”
(2)证明GCD(a,b)是b,a%b的最大公约数
a%b=(k1-k * k2)*d
b=k2 * d
即要证明**(k1-k * k2) 和 k2互质**
反证法:设两者不互质,且含有最大公因子t(t>1),p,q互质
(k1-k * k2) = q * t →k1=q * t+k * k2
k2=p * t
所以有:
a=(q * t+k * k2) * d = (q * t+k * p * t) * d=(q+kp)*dt
b=p * dt
则GCD(a,b)=t * d,与上面假设矛盾,假设不成立,所以两者互质,是最大公约数
int gcd(int x,int y) { if(x<y) return gcd(y,x); // x>y if(y==0) return x; // if y=0, x is GCD else { if(x%2==0) { if(y%2==0) //x,y both even return 2*gcd(x>>1,y>>1); else // x is even, y is odd return gcd(x>>1,y); } else { if(y%2==0) // x is odd, y is even return gcd(x,y>>1); else // x, y both odd return gcd(y,x-y); } } }
当然,我们还有二进制GCD,计算机取模运算的效率是很低的,而对于位运算却可以是高效的。
面对大整数取模运算,其速度是非常慢的
最大公约数有几个性质:
-
GCD(a,b) = GCD(a-b,b) 其中a>b
-
GCD(a,b) =k * GCD(a1,b1) 其中a=k * a1,b=k * b1 (a,b不互质的时候,把公因数提出来)
-
如果a=p * a1,p是素数,且b和p互质,那么 GCD(a,b) = GCD(p * a1,b) = GCD(a1,b)
-
取p=2,有以下性质:
(1)如果 a,b都是偶数,那么 GCD(a , b) = GCD(a>>1, b>>1) * 2
(2)如果 a是偶数, b是奇数,那么 GCD(a , b) = GCD(a>>1, b)
(3)如果 a是奇数, b是偶数,那么 GCD(a , b) = GCD( (a-b)>>1, b)
int GCD(int x,int y){
int i=0,j=0;
if(x==0)
return y;//if和for一定不能反,要么会炸
if(y==0)
return x;//一个没用了就返回另一个
for(i;0==(x&1);i++)
x>>=1;//化简为n*(m^2)形式
for(j;0==(y&1);j++)
y>>=1;//化简为a*(b^2)形式
if(i>j)
i=j;//去最大 公 因数,当然是你有我有的了
while(1){
if(x<y)
x^=y,y^=x,x^=y;//二进制交换,非常高级
if(0==(x-=y))
return y<<i;//那么就把以前的次幂乘上去,辗转减操作
while(0==(x&1))
x>>=1;//x减了y以后可能还是成为a*(b^2)形式,要继续筛去
}
}
六、最小公倍数(Least Common Multiple, LCM)
两个或多整数公有的倍数叫做它们的公倍数,其中除 0以外最小的一个公倍数就叫做这几个整数的最小公倍数
LCM(a,b)的计算,给定两个整数a,b
a = p 1 e 1 p 2 e 2 . . . p r e r , b = p 1 f 1 p 2 f 2 . . . p r f r a=p_{1}^{e_1}p_{2}^{e_2}...p_{r}^{e_r},b=p_{1}^{f_1}p_{2}^{f_2}...p_{r}^{f_r} a=p1e1p2e2...prer,b=p1f1p2f2...prfr
那么
G C D ( a , b ) = p 1 min ( e 1 , f 1 ) p 2 min ( e 2 , f 2 ) . . . p r min ( e r , f r ) GCD( a,b ) =p_{1}^{\min (e_1,f_1 )}p_{2}^{\min ( e_2,f_2 )}...p_{r}^{\min (e_r,f_r )} GCD(a,b)=p1min(e1,f1)p2min(e2,f2)...prmin(er,fr)
L C M ( a , b ) = p 1 max ( e 1 , f 1 ) p 2 max ( e 2 , f 2 ) . . . p r max ( e r , f r ) LCM( a,b ) =p_{1}^{\max (e_1,f_1 )}p_{2}^{\max ( e_2,f_2 )}...p_{r}^{\max (e_r,f_r )} LCM(a,b)=p1max(e1,f1)p2max(e2,f2)...prmax(er,fr)
明显有:GCD(a,b) * LCM(a,b)= a * b
即:LCM(a,b)=a * b / GCD(a,b)
七、贝祖定理
贝祖定理:对于非零整数a,b,有 d = g c d ( a , b ) d=gcd\ (a,b) d=gcd (a,b),那么就存在整数 x和 y,使得 a x + b y = d ax+by=d ax+by=d
证明:对于非零整数a,b,a%b=r1,r1严格小于|b|,并且gcd(a,b)=gd(r1,b),然后我们重复的进行下去
a = b x 1 + r 1 , 0 < r 1 < ∣ b ∣ a=bx_1+r_1,0<r_1<|b| a=bx1+r1,0<r1<∣b∣
b = r 1 x 2 + r 2 , 0 < r 2 < r 1 b=r_1x_2+r_2,0<r_2<r_1 b=r1x2+r2,0<r2<r1
…
r n − 1 = r n x n + 1 + r n + 1 , 0 < r n + 1 < r n r_{n-1}=r_nx_{n+1}+r_{n+1},0<r_{n+1}<r_n rn−1=rnxn+1+rn+1,0<rn+1<rn
r n = r n + 1 x n + 2 r_n=r_{n+1}x_{n+2} rn=rn+1xn+2(此时余数为0了)
当 r n + 1 r_{n+1} rn+1是除法过程最后一个非零数余数,代入上式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JZJ2CJB-1582040933969)(http://pvyyuu4id.bkt.clouddn.com/41.png)]
贝祖定理扩展:如果 a x + b y = n ax+by=n ax+by=n 有解,充要条件是 n 是gcd(a,b)的倍数
证明:
八、扩展欧几里得算法
给出a,b,去计算 a x + b y = g c d ( a , b ) ax+by=gcd\ (a,b) ax+by=gcd (a,b)的算法即为扩展欧几里得算法
边界情况:b = 0,a = gcd (a,b)
a * 1+b * 0=gcd (a,b) → x=1,y=0
递推情况:从下一层反推回当前层
假定下一层已求解: b ∗ x 1 + ( a % b ) ∗ y 1 = g c d b * x_1+(a \%b) * y_1=gcd b∗x1+(a%b)∗y1=gcd
将 a % b = a − ( a / b ) ∗ b a\%b=a-(a/b) * b a%b=a−(a/b)∗b 代入上式:
b ∗ x 1 + ( a − ( a / b ) ∗ b ) ∗ y 1 = g c d b * x_1+(a-(a/b) * b) * y_1=gcd b∗x1+(a−(a/b)∗b)∗y1=gcd
→ b ∗ x 1 + a ∗ y 1 − ( a / b ) ∗ b ∗ y 1 = a ∗ y 1 + b ∗ ( x 1 − ( a / b ) ∗ y 1 ) = g c d b* x_1+a* y_1-(a/b)* b* y_1=a* y_1+b* (x_1-(a/b)* y_1)=gcd b∗x1+a∗y1−(a/b)∗b∗y1=a∗y1+b∗(x1−(a/b)∗y1)=gcd
→ x = y 1 , y = x 1 − ( a / b ) ∗ y 1 x=y_1,\ y=x_1-(a/b) *y_1 x=y1, y=x1−(a/b)∗y1
注意:(关于通解)方程ax+by=gcd(a,b)的解不唯一
设 x 0 , y 0 x_0,y_0 x0,y0是一组解,则 x 0 + t ∗ b / g c d ( a , b ) x_0+t* b/gcd(a,b) x0+t∗b/gcd(a,b)和 y 0 − t ∗ a / g c d ( a , b ) y_0-t* a/gcd(a,b) y0−t∗a/gcd(a,b)也是解,t为任意整数
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return r;//r=gcd(a,b)
}
void exgcd(int a,int b,int &d,int &x,int &y)
{
if(b==0)
{
d=a;
x=1;
y=0;
}
else
{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
九、一元线性同余方程
-
求解方程ax+by=c
先判定是否有解:ax+by=c,有解的充要条件是 gcd(a,b)|c
如有解,方程有 gcd(a,b) 个模b不同余的解
设d=gcd(a,b)
使用扩展欧几里得算法得到 ax+by=d 的一组特解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)
设 k = c d k=\frac{c}{d} k=dc,则ax+by=c的解集是 x = k x 0 + b d t x=kx_0+\frac{b}{d}t x=kx0+dbt, y = k y 0 − a d t y=ky_0-\frac{a}{d}t y=ky0−dat (t为任意整数)
其中,x 模b不同余的解共有 d个:
x = k x 0 + b d t x=kx_0+\frac{b}{d}t x=kx0+dbt (t=0,1,…,d-1)
设 s = b d s=\frac{b}{d} s=db,x的最小非负解: ( ( k x 1 ) % s + s ) % s ((kx_1)\%\ \ s+s)\ \%\ s ((kx1)% s+s) % s
-
模逆(逆元)
在模n运算下,整数a和x互为乘法逆元
对于整数a,n,如果有gcd(a,n)=1,那么就存在一个整数x使得 ax=1(mod n)
由贝祖定理知,存在x,y使得 ax+ny=gcd(a,n)=1,即 1≡ax+ny≡ax (mod n)
用扩展欧几里得算法求解方程:ax+ny=1
注意:当a和n不互质时,模逆无解
当n时素数时,模逆也可以用费马小定理求: x = a n − 2 x=a^{n-2} x=an−2
逆元的重要应用:求除法的模 (a/b) mod m
直接计算是求a/b,然后取模,但是如果b是大整数,做除法后再取模会损失精度,此时,需要避开除法计算
设b的逆元是k,将除法的模转换为带模乘法:
( a b ) m o d m = ( ( a b ) m o d m ) ∗ ( ( b ∗ k ) m o d m ) = ( a b ∗ b ∗ k ) m o d m = ( a ∗ k ) m o d m (\frac{a}{b} )\ mod\ m=((\frac{a}{b})\ mod\ m) * ((b * k)\ mod\ m)=(\frac{a}{b} * b * k)\ mod\ m=(a * k)\ mod\ m (ba) mod m=((ba) mod m)∗((b∗k) mod m)=(ba∗b∗k) mod m=(a∗k) mod m
十、中国剩余定理
设k组数
(
a
i
,
n
i
)
(a_i,n_i)
(ai,ni),其中,
n
i
n_i
ni 两两互素,要找到最小的正整数x,满足方程组
x
≡
a
i
(
m
o
d
n
i
)
x≡a_i \ (mod\ n_i)
x≡ai (mod ni),(i=1,2,…k)
算法步骤:
令 n = n 1 n 2 n 3 . . . n k , m i = n n i n=n_1n_2n_3...n_k,m_i=\frac{n}{n_i} n=n1n2n3...nk,mi=nin
显然 g c d ( m i , n i ) = 1 gcd(m_i,n_i)=1 gcd(mi,ni)=1,采用扩展欧几里得算法计算出 x i x_i xi 满足 m i x i ≡ 1 ( m o d n i ) m_ix_i≡1\ (mod\ n_i) mixi≡1 (mod ni)
方程组的解 x = ( a 1 x 1 m 1 + a 2 x 2 m 2 + . . . + a k x k m k ) m o d n x=(a_1x_1m_1+a_2x_2m_2+...+a_kx_km_k)\ mod\ n x=(a1x1m1+a2x2m2+...+akxkmk) mod n
方程组的任意两个解 模n同余,因此x就是最小的解
证明 x = a 1 x 1 m 1 + a 2 x 2 m 2 + . . . + a k x k m k x=a_1x_1m_1+a_2x_2m_2+...+a_kx_km_k x=a1x1m1+a2x2m2+...+akxkmk 是解
x m o d n i = ( a 1 x 1 m 1 + a 2 x 2 m 2 + . . . + a k x k m k ) m o d n i = a i x i m i m o d n i = a i m o d n i x\ mod\ n_i=(a_1x_1m_1+a_2x_2m_2+...+a_kx_km_k)\ mod\ n_i=a_ix_im_i\ mod\ n_i=a_i\ mod\ n_i x mod ni=(a1x1m1+a2x2m2+...+akxkmk) mod ni=aiximi mod ni=ai mod ni
证明 任意两个解 模n同余,即 x 1 ≡ x 0 ( m o d n ) x_1≡x_0\ (mod\ n) x1≡x0 (mod n)
设有两个解 x 1 , x 0 x_1,x_0 x1,x0 则:
x 1 ≡ a i ( m o d n i ) ( i = 1 , 2 , . . . k ) x_1≡a_i(mod\ n_i)\ (i=1,2,...k) x1≡ai(mod ni) (i=1,2,...k)
x 0 ≡ a i ( m o d n i ) ( i = 1 , 2 , . . . k ) x_0≡a_i(mod\ n_i)\ (i=1,2,...k) x0≡ai(mod ni) (i=1,2,...k)
→ n i ∣ ( x 1 − x 0 ) ( i = 1 , 2 , . . . k ) n_i|(x_1-x_0)\ (i=1,2,...k) ni∣(x1−x0) (i=1,2,...k)
n i ∣ ( x 1 − x 0 ) n_i|(x_1-x_0) ni∣(x1−x0) 且 n i n_i ni 两两互质→ x 1 ≡ x 0 ( m o d n ) x_1≡x_0\ (mod\ n) x1≡x0 (mod n)
扩展中国剩余定理
n i n_i ni 不一定两两互素
分析:
x ≡ a 1 ( m o d n 1 ) x≡a_1(mod\ n_1) x≡a1(mod n1)
x ≡ a 2 ( m o d n 2 ) x≡a_2(mod\ n_2) x≡a2(mod n2)
→ x + u ∗ n 1 = a 1 x+u * n_1=a_1 x+u∗n1=a1 且 x + v ∗ n 2 = a 2 x+v * n_2=a_2 x+v∗n2=a2
→ n 1 ∗ u + n 2 ∗ v = ( a 1 − a 2 ) n_1 * u+n_2 * v=(a_1-a_2) n1∗u+n2∗v=(a1−a2)
此关于u,v的方程当且仅当 g c d ( n 1 , n 2 ) ∣ ( a 1 − a 2 ) gcd(n_1,n_2)|(a_1-a_2) gcd(n1,n2)∣(a1−a2) 时有解
用扩展欧几里得算法求解 n 1 ∗ u + n 2 ∗ v = ( a 1 − a 2 ) n_1 * u+n_2 * v=(a_1-a_2) n1∗u+n2∗v=(a1−a2)
一组解为 ( u 0 , v 0 ) (u_0,v_0) (u0,v0) ,此方程解集为:(t为任意整数)
u = u 0 + t ∗ n 2 g c d ( n 1 , n 2 ) u=u_0+t * \frac{n_2}{gcd(n1,n2)} u=u0+t∗gcd(n1,n2)n2
v = v 0 − t ∗ n 1 g c d ( n 1 , n 2 ) v=v_0-t * \frac{n_1}{gcd(n1,n2)} v=v0−t∗gcd(n1,n2)n1
x + u ∗ n 1 = a 1 x+ u * n_1=a_1 x+u∗n1=a1 → x = a 1 − u 0 ∗ n 1 − t ∗ n 1 ∗ n 2 g c d ( n 1 , n 2 ) x=a_1-u_0 * n_1-\frac{t * n_1 * n_2}{gcd(n_1,n_2)} x=a1−u0∗n1−gcd(n1,n2)t∗n1∗n2
即: x = a 1 − u 0 ∗ n 1 − t ∗ l c m ( n 1 , n 2 ) x=a_1-u_0 * n_1-t * lcm(n_1,n_2) x=a1−u0∗n1−t∗lcm(n1,n2),t为任意整数
即: x ≡ a 1 − u 0 ∗ n 1 ( m o d l c m ( n 1 , n 2 ) ) x≡a_1-u_0 * n_1(mod\ lcm(n_1,n_2)) x≡a1−u0∗n1(mod lcm(n1,n2))
以上两个过程等价于
两个方程 x ≡ a 1 ( m o d n 1 ) x≡a_1(mod\ n_1) x≡a1(mod n1)和 x ≡ a 2 ( m o d n 2 ) x≡a_2(mod\ n_2) x≡a2(mod n2)
被合并为: x ≡ a 1 − u 0 ∗ n 1 ( m o d l c m ( n 1 , n 2 ) ) x≡a_1-u_0 * n_1(mod\ lcm(n_1,n_2)) x≡a1−u0∗n1(mod lcm(n1,n2))
继续合并下去,不断将两个方程并为一个,最后就能求得x的解
十一、高次同余方程
十二、习题
余数之和 BZOJ-1257
Matrix Power Series POJ-3233
LCM Walk HDU-5584
A sequence of numbers HDU-2817(快速幂)
Hankson的趣味题 NOIP-2009 (GCD)
Astronomy POJ-3101 (LCM+大数运算)
Contemplation! Algebra UVA-10655(矩阵快速幂)
C Looooops 百练2115
Biorhythms POJ-1006
瞬间移动 HDU-5698
The Balance POJ-2142 (扩展欧几里得)
One Person Game ZOJ-3593 (扩展欧几里得)
Beautiful Trees Cutting (等比数列+模逆)
X问题 HDU-1573 (中国剩余定理)
Mod Tree HDU-2815
Strange way to exp. int. POJ-2891 (扩展中国剩余定理)
计算器 洛谷-P2485 (BSGS)