bzoj5104 Fib數列(BSGS 二次剩餘)

2022-05-05 12:45:13 字數 768 閱讀 7413

快afo了才第一次寫二次剩餘的題……

顯然應該將fn寫成通項公式(具體是什麼寫起來不方便而且大家也都知道),設t=((1+√5)/2)n,t=√5n,然後可以得到t-(-1)t/t=√5n,兩邊同時乘t,移項,得到t2-√5nt-(-1)n=0。分別討論n是奇數或偶數的情況,通過求根公式求t,寫個二次剩餘即可。

#includeusing

namespace

std;

const

int sq5=383008016,inv2=5e8+5,mod=1e9+9,inf=0x7fffffff

;int n,w,ans=inf;

mapmp;

struct

com;}

};int qpow(int a,int

b)

return

ret;

}int sqrt(int

n),ans=(com);

int y=inv2;

w=(1ll*a*a%mod+mod-n)%mod;

while

(y)

return

ans.x;

}int bsgs(int t,int

n)

return -1;}

intmain()

if(r1)

if(ans==inf)puts("

-1");else printf("%d"

,ans);

}

view code

BZOJ5104 Fib數列(二次剩餘 BSGS)

傳送門 題意 給定a 求fn a mod1e 9 9 輸出最小的 n 題解 fib數列的通項 fn 15 1 5 2 x 1 5 2 n 5 是1e9 9的一類二次剩餘。可以對其開根號 5 3830080162 mod1e9 9 開根號的方法 設x 1 5 2,t 5 a那麼公式可表達為 xn 1 ...

計蒜客 Fib數列問題二

用 fib n 表示斐波那契數列的第 n項,現在要求你求 fib n mod m。fib 1 1,fib 2 1。輸入格式 輸入 2 個整數 n 1 n 10 18 m 2 m 100000000 輸出格式 輸出 fib n 對 m 取模的值。樣例輸入 100000000 100000000 樣例輸...

BZOJ4282 慎二的隨機數列

省選前刷水記錄 構造 很顯然我們要讓那些未知的都加入最終答案 這樣子答案才最大 然後就很簡單了。很奇怪的是本地int main 不加int不會報錯 oj上會ce include include include using namespace std define ll long long int c...