0%

Simple Fibonacci


题目链接:VJ(private)


Simple Fibonacci

题目描述

求斐波那契数列第n项对于1004535809取模的值。

解释

正解是矩阵快速幂(之后补)。
我用了二次剩余的板子写,直接代入通项公式。

代码部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<bits/stdc++.h>
using namespace std;
const long long p=1004535809;
long long f(long long a,long long b)
{
long long ans=1;
while (b) {
if (b&1) ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans;
}
long long TS(long long n)
{
if (p==2) return (n&1)?1:-1;
if (f(n,p>>1)+1==p) return -1;
if (p&2) return f(n,p+1>>2);
int s=__builtin_ctzll(p^1);
long long q=p>>s,z=2;
for (;f(z,p>>1)==1;++z);
long long c=f(z,q),r=f(n,q+1>>1),t=f(n,q),tmp;
for (int m=s,i;t!=1;) {
for (i=0,tmp=t;tmp!=1;++i) tmp=tmp*tmp%p;
for (;i<--m;) c=c*c%p;
r=r*c%p;
c=c*c%p;
t=t*c%p;
}
return r;
}
const long long q=TS(5);
int main()
{
long long n;
cin>>n;
cout<<f(q,p-2)*(f((1+q)*f(2,p-2)%p,n)-f((1-q)*f(2,p-2)%p,n)+p)%p;
return 0;
}
谢谢你,秋刀鱼今天有吃的了!!!