P2626 斐波那契数列(升级版)(合数的质数分解, 大数为素数的概率十分小的利用)

题目背景

大家都知道,斐波那契数列是满足如下性质的一个数列:

  • f(1)=1f(1) = 1 f(1)=1
  • f(2)=1f(2) = 1f(2)=1
  • f(n)=f(n−1)+f(n−2)f(n) = f(n-1) + f(n-2)f(n)=f(n−1)+f(n−2) (n≥2n ≥ 2n≥2 且 nnn 为整数)。

题目描述

请你求出第nnn个斐波那契数列的数mod(或%)2312^{31}231之后的值。并把它分解质因数。

输入输出格式

输入格式:

n

输出格式:

把第nnn个斐波那契数列的数分解质因数。

输入输出样例

输入样例#1:
复制
5
输出样例#1: 复制
5=5
输入样例#2: 复制
6
输出样例#2: 复制
8=2*2*2

说明

n≤48n \le 48n≤48

思路:本来用了矩阵快速幂(没看n的范围以为很大)但是死活不过因为n=48和n=47时,斐波拉契数列的值不对,但是n>48的值

都是对的,所以我就改用了比较直接的方法。

但是本题主要是用了合数分解为质数乘积的模板和利用大数是素数的概率很小的技巧。

#include<iostream>
#define ll long long
#define mod 2147483648
using namespace std;
int main()
{
ll num[];
num[] = num[] = ;
for (int i = ; i < ; ++i)
num[i] = (num[i - ] + num[i - ]) % mod;
int n;
cin >> n;
ll kk = num[n];
ll num1[], cnt = ;
for (ll i = ; kk != ; ++i)
{
while (kk%i == )
{
num1[cnt++] = i;
kk /= i;
}
if (i > )break;
}
if (kk != )num1[cnt++] = kk;
cout << num[n] << "=";
for (int i = ; i < cnt; ++i)
{
cout << num1[i] << "*\n"[i == cnt - ];
}
}
上一篇:用SecureCRT来上传和下载数据


下一篇:如何用JavaScript判断dom是否有存在某class的值?