題意非常簡單,a,b,n都是正整數,求
Sn=⌈(a+b√)n⌉%m,(a−1)2
這個題目也是2008年Google Codejam Round 1A的C題。
做法其實非常簡單,記(a+b√)n為An,配項
Cn=An+Bn=(a+b√)n+(a−b√)n
兩項恰好共轭,所以Cn是整數。又根據限制條件
(a−1)2
也就是說Cn=⌈An⌉
Sn=(Cn)%m
求Cn的方法是遞推。 對Cn乘以(a+b√)+(a−b√)
於是
Cn+1=2aCn−(a2−b)Cn−1
把這個遞推式寫成矩陣形式
[Cn+1Cn]=[2a1−(a2−b)0][CnCn−1]
於是就可以用矩陣快速冪來做了
[Cn+1Cn]=[2a1−(a2−b)0]n[C1C0]
---------------------------------------------------------------------------- 以上是原版的題解。 這個題目是我做訓練賽的時候做到的,當時沒做出來,後來看題解,一開始不明白為什麼C[N]=[ A[N] ]; 後來的時候百度了一下共轭的定義發現: C[N]一定是一個整數。 B[N]又小於1. 所以 C[N]=[ A[N] ]=A[N]+B[N];
#include
#include
#include
#include
#include
#include
#include
#include