• 数字


    给你一个斐波那契数列 F:
    F0=0,F1=1;
    Fn=Fn−1+Fn−2;
    给你一个数 k,可以从斐波那契数列中选取可以重复的 k 个数:Fa1,Fa2,
    Fa3....
    求最小的 N 使得,Fa1+Fa2+Fa3...+Fak 不能构成数字 N。

    k小于1e9

     1 #include <cstdio>
     2 using namespace std;
     3 typedef long long LL;
     4 
     5 const LL prime=998244353;
     6 LL n, t;
     7 LL a[2][2], tmp1[2][2], tmp2[2][2];
     8 
     9 void plus22(LL a[2][2], LL b[2][2]){
    10     tmp2[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];
    11     tmp2[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1];
    12     tmp2[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0];
    13     tmp2[1][1]=a[1][0]*b[0][1]+a[1][1]*b[1][1];
    14     a[0][0]=tmp2[0][0]%prime, a[0][1]=tmp2[0][1]%prime;
    15     a[1][0]=tmp2[1][0]%prime, a[1][1]=tmp2[1][1]%prime;
    16 }
    17 
    18 void plus21(LL a[2][2], LL b[2][2]){
    19     tmp2[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];
    20     tmp2[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0];
    21     a[0][0]=tmp2[0][0]%prime, a[1][0]=tmp2[1][0]%prime;
    22 }
    23 
    24 LL fib(LL n){
    25     a[0][1]=0, a[1][0]=0, a[0][0]=1, a[1][1]=1;
    26     tmp1[0][0]=tmp1[0][1]=tmp1[1][0]=tmp1[1][1]=1;
    27     tmp1[1][1]=0;
    28     --n;
    29     while (n){
    30         if (n&1) plus22(a, tmp1);
    31         plus22(tmp1, tmp1);
    32         n>>=1;
    33     }
    34     tmp1[0][0]=1, tmp1[1][0]=0;
    35     plus21(a, tmp1);
    36     return a[0][0];
    37 }
    38 
    39 int main(){
    40     while(~scanf("%lld", &n))
    41         printf("%lld
    ", (fib(2*n+3)-1)%prime);
    42     return 0;
    43 }

    这道题就打表+矩阵快速幂求斐波那契数列。。

  • 相关阅读:
    动手学深度学习 | 单机多卡并行 | 32
    动手学深度学习 | 深度学习硬件:TPU和其他 | 31
    动手学深度学习 | 深度学习硬件:CPU和GPU | 30
    动手学深度学习 | ResNet为什么能训练出1000层的模型 | 28
    过滤器 filter
    JSP
    Servlet之会话 cookie session
    Servlet Response对象
    Servlet Request对象
    Http&Servlet
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/7541673.html
Copyright © 2020-2023  润新知