1. 程式人生 > >P2626 斐波那契數列(升級版)

P2626 斐波那契數列(升級版)

sam sin use important turn 質數 spa pre stream

題目背景

大家都知道,斐波那契數列是滿足如下性質的一個數列: ? f(1) = 1 ? f(2) = 1 ? f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 為整數)。

題目描述

請你求出第n個斐波那契數列的數mod(或%)2^31之後的值。並把它分解質因數。

輸入輸出格式

輸入格式:

n

輸出格式:

把第n個斐波那契數列的數分解質因數。

輸入輸出樣例

輸入樣例#1: 復制
5
輸出樣例#1: 復制
5=5
輸入樣例#2: 復制
6
輸出樣例#2: 復制
8=2*2*2

說明

n<=48

嗯,這道題沒有那麽那麽那麽的數學化了。

看題目,那就分成三塊:

1、斐波那契求第n個數;

2、這個數%2^31(useless);

3、將這個數分解成幾個質數的乘積(the most important I think)。

第三步我用的dfs。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 int n;
 7 bool b;
 8 long long f[52];
 9  long long
xx(int x,int y) //為了求2^31,但實際好像沒什麽用。 10 { 11 long long a=1; 12 for(int i=1;i<=y;++i) 13 a*=x; 14 return a; 15 } 16 void dfs(int x,int y) //分解x,y為x的除1以外的最小的質因數。 17 { 18 if(x<y) return ; 19 for(int i=y;i<=x;++i) 20 if(!(x%i)) //如果能整除 21 {
22 if(b) printf("*"); 23 else b=1; 24 printf("%d",i); //輸出這個因數 25 dfs(x/i,i); //因為是分解成因數的乘積,已經輸出一個因數了, 26 //所以以後要分解的數就變成了x/i; 27 return ; 28 } 29 } 30 int main() 31 { 32 scanf("%d",&n); 33 f[1]=1; 34 f[2]=1; 35 for(int i=3;i<=n;++i) //斐波那契 36 f[i]=f[i-1]+f[i-2]; 37 f[n]=f[n]%xx(2,31); 38 printf("%d=",f[n]); 39 dfs(f[n],2); //1不是質數,從2開始篩 40 return 0; 41 }

另:

我感覺不是lxl人格分裂,,是我人格分裂。


我好想你,好想我媽,我媽真的很好很好很好,她是世界上最好的人。
希望你們一切都好。

告訴我吧,別再沈默如迷。

P2626 斐波那契數列(升級版)