传送门 : AOJ
题解
斐波那契素数 : 除了 F[3]和F[4]之后, 质数项Fibonacci为和前面互质
矩阵快速幂优化
code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define mod 10003
const int N = 1000000 + 5;
int prime[N];
bool f[N * 10];
void getPrime(){
memset(f, 0, sizeof f);
int cnt = 0;
for(int i = 2; i < N * 10 && cnt < N - 5; ++i){
if(!f[i]) prime[++cnt] = i;
for(int j = 1; j <= cnt && prime[j] * i <= N * 10; ++j){
f[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
}
}
}
struct Matrix{
int mat[2][2];
void clr(){
memset(mat, 0, sizeof mat);
}
void E(){
clr();
for(int i = 0; i < 2; ++i) mat[i][i] = 1;
}
Matrix operator * (Matrix b){
Matrix rs;
rs.clr();
for(int i = 0; i < 2; ++i)
for(int j = 0; j < 2; ++j)
for(int k = 0; k < 2; ++k)
rs.mat[i][j] = (rs.mat[i][j] + mat[i][k] * b.mat[k][j]) % mod;
return rs;
}
Matrix operator ^ (int b){
Matrix res, tmp;
res.E();
memcpy(tmp.mat, mat, sizeof mat);
while(b){
if(b & 1) res = res * tmp;
tmp = tmp * tmp;
b >>= 1;
}
return res;
}
};
int main(){
getPrime();
int n;
while(cin >> n, n){
int b = n <= 2 ? n + 2 : prime[n];
Matrix res;
res.clr();
res.mat[1][1] = res.mat[0][1] = res.mat[1][0] = 1;
Matrix ans = res ^ b;
cout << ans.mat[0][1] << endl;
}
return 0;
}