Ginomial Theorem Hard 指数循环节,逆元,Fibonacci循环节 反素数

Download Report

Transcript Ginomial Theorem Hard 指数循环节,逆元,Fibonacci循环节 反素数

Ginomial Theorem
Hard
指数循环节,逆元,Fibonacci循环节
反素数,lucas定理,中国剩余定理,平方剩余
Description
• 定义
• 求F(G(X,Y,N)) mod 961749331
• 规模
– 1 ≤ X, Y, N ≤ 10^9
Algorithm - 前置知识
• 平方剩余
• 指数循环节
•
•
•
•
中国剩余定理
lucas定理
反素数(Highly Composite Number)
Fibonacci数列循环节
Algorithm
• 这道题目有两种做法,一个是基于指数循
环节,另一个是基于Fibonacci循环节
• 两种做法的本质是一样的,这里只讲基于
指数循环节的做法
Algorithm
• F[n]=1/sqrt{5} * (((1 + sqrt{5}) / 2)^n - ((1 sqrt{5}) / 2)^n)
• sqrt{5}可以在961749331的有限域中表示
• 解x^2 ≡ 5 (mod 961749331),可以得到x =
169508191 或者 x = 792241140
• 令p = 961749331,s5 = 169508191(其实
792241140也可以),u = (1 + s5) / 2, v = 1
- u + p,i5表示s5在p下的逆元
• 那么F[n] ≡ i5 * (u ^ n - v ^ n) (mod p)
Algorithm
• 然后我们只要计算出u^G(X, Y N)即可
• 利用指数循环节公式,我们只需要计算
G(X, Y, N) mod φ(p)
• 然后,我们将φ(p)质因数分解之后可以发现
φ(p) = p - 1 = 961749330 = 2 × 3 × 5 × 17
× 29 × 65027
• 可以利用中国剩余定理计算G(X, Y, N) mod
φ(p)
Algorithm
• 计算G(X, Y, N) mod p,p是一个小质数
• 枚举gcd(i, N)的值为d,那么
• 但是,这样还是不能高效计算G(X, Y, N)
• 考虑S(Y, N, d) = ∑Y^i , (i, N) = d, i <= N
• 利用容斥原理可以化简S(Y, N, d)
Algorithm
• 然后计算所有S(Y, N, d)的复杂度变成
O(d(N)^2)
• 其中d(N)表示N的约数个数
• 然后我们知道如果d(N)很小的话,这道题目
就解决了,但是d(N)到底有多大呢?
• 利用Highly composite number可以算出
在10^9以内,d(N)最大为1600
• 我们只要在O(d(N)^2)内预处理出所有S(Y,
N, d),这道题目就搞定了
Algorithm
• 算组合数可以用lucas定理
• 算法比较复杂,容易写错
Another Algorithm
• 可以证明,Fibonacci数列mod 961749331
的循环节是961749330
• 只要计算G(X, Y, N) mod 961749330,然后
用矩阵乘法加速
• 不需要求逆元和平方剩余