Problem
題目網址
找出第 n 個 fibonacci prime ,費氏數列中某數,如果和比它小的所有 $F_n$ 數字互質,就稱它為 fibonacci prime。
如果大於 9 位數,只需要輸出前 9 位。
Solution
這裡有查到一個特性,如果 n
為質數,fib[n]
也會為質數,有些特例需要處理,詳細請看 Fibonacci Prime。
fib[2] = 2;
fib[3] = 3;
這裡還有個 fib[prime[8]] = fib[19] = 4181
,$ 4181 = 37 \times 113$ ,並沒有處理到,不過不知為何還是拿了 AC …
費氏數列增長很快,一下就變得要處理大數了,這裡可以使用 double
,因為只需要前九位精準即可,只要數字超過 1e9
就將它除以 10。
p.s. 記得輸出時要轉型,避免四捨五入的情況發生。
Code
UVa 10236UVa 10236 - The Fibonacci Primes1 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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include<cstdio> #include<cmath> #define MAX 300000 #define N 250000 #define M 22001
bool sieve[MAX]; int prime[M]; void getPrime();
double fib[N] = { 0, 1 }; void getFibPrime(); int main() { getPrime(); getFibPrime(); int n;
fib[2] = 2; fib[3] = 3; while (scanf("%d", &n) != EOF) printf("%d\n", (int)fib[prime[n]]); return 0; } void getPrime() { int s = sqrt(MAX); for (int i = 2; i < s; i++) { if (!sieve[i]) { for (int j = i <<1; j < MAX; j += i) sieve[j] = true; } }
int count = 1; for (int i = 2; i < MAX; i++) { if (!sieve[i]) prime[count++] = i; } } void getFibPrime() { bool div = false; for (int i = 2; i < N; i++) { if (div) { fib[i] = fib[i - 1] + fib[i - 2] / 10; div = false; } else fib[i] = fib[i - 1] + fib[i - 2];
if (fib[i] >= 1e9) { fib[i] /= 10; div = true; } } }
|