• 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(n1)+f(n2) (n≥2n ≥ 2n2 且 nnn 为整数)。

    题目描述

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

    输入输出格式

    输入格式:

    n

    输出格式:

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

    输入输出样例

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

    说明

    n≤48n le 48n48

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

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

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

    #include<iostream>
    #define ll long long
    #define mod 2147483648
    using namespace std;
    int main()
    {
        ll num[50];
        num[1] = num[2] = 1;
        for (int i = 3; i < 50; ++i)
            num[i] = (num[i - 1] + num[i - 2]) % mod;
        int n;
        cin >> n;
        ll kk = num[n];
        ll num1[200], cnt = 0;
        for (ll i = 2; kk != 1; ++i)
        {
            while (kk%i == 0)
            {
                num1[cnt++] = i;
                kk /= i;
            }
            if (i > 1000)break;
        }
        if (kk != 1)num1[cnt++] = kk;
        cout << num[n] << "=";
        for (int i = 0; i < cnt; ++i)
        {
            cout << num1[i] << "*
    "[i == cnt - 1];
        }
    }
  • 相关阅读:
    用导数解决逗逼初三数学二次函数图像题
    NOIP 2014 pj & tg
    BZOJ 1004
    双参数Bellman-ford带队列优化类似于背包问题的递推
    emu1
    無題
    15 day 1代碼
    javascript quine
    线段树的总结
    Watering the Fields(irrigation)
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9581469.html
Copyright © 2020-2023  润新知