首页 > 代码库 > [NOIP1997] P2626 斐波那契数列(升级版)

[NOIP1997] P2626 斐波那契数列(升级版)

 

题目背景

大家都知道,斐波那契数列是满足如下性质的一个数列: • 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

 

97年的陈酿题……要是以当时的设备水平,真不知道该怎么做了。

然而现在是小水题了。

先打个素数表,再模拟搞出来斐波那契数,之后质因数分解即可。

 

 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const long long mod=1<<31;10 const int mxn=3000000;11 int read(){12     int x=0,f=1;char ch=getchar();13     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}14     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}15     return x*f;16 }17 int pri[mxn],cnt;18 bool vis[mxn];19 void Pri(){20     int m=sqrt(mxn);21     for(int i=2;i<m;i++){22         if(!vis[i]){23             pri[++cnt]=i;24         }25         for(int j=1;j<=cnt && pri[j]*i<mxn;j++){26             vis[pri[j]*i]=1;27             if(i%pri[j]==0)break;28         }29     }30     return;31 }32 void dvi(long long x){33     int i,j;34     bool flag=0;35     for(i=1;i<=cnt;i++){36         while(x%pri[i]==0){37             if(!flag)printf("%d",pri[i]);38             else printf("*%d",pri[i]);39             flag=1;40             x/=pri[i];41         }42     }43     if(x>1){44         if(!flag)printf("%lld",x);45         else printf("*%lld",x);46     }47     printf("\n");48     return;49 }50 int n;51 long long f[49];52 int main(){53     n=read();54     Pri();55     f[1]=1;f[2]=1;56     for(int i=3;i<=n;i++){57         f[i]=(f[i-1]+f[i-2])%mod;58     }59     printf("%lld=",f[n]);60     dvi(f[n]);61     return 0;62 }

 

[NOIP1997] P2626 斐波那契数列(升级版)