zoukankan      html  css  js  c++  java
  • CF_225B _Well-known Numbers

    Numbers k-bonacci (k is integer, k > 1) are a generalization of Fibonacci numbers and are determined as follows

    • F(k, n) = 0, for integer n1 ≤ n < k;
    • F(k, k) = 1;
    • F(k, n) = F(k, n - 1) + F(k, n - 2) + ... + F(k, n - k), for integer nn > k.

    Note that we determine the k-bonacci numbers, F(k, n), only for integer values of n and k.

    You've got a number s, represent it as a sum of several (at least two) distinct k-bonacci numbers.

    Input

    The first line contains two integers s and k (1 ≤ s, k ≤ 109k > 1).

    Output

    In the first line print an integer m (m ≥ 2) that shows how many numbers are in the found representation. In the second line print mdistinct integers a1, a2, ..., am. Each printed integer should be a k-bonacci number. The sum of printed integers must equal s.

    It is guaranteed that the answer exists. If there are several possible answers, print any of them.

    题目背景是一个k—Fibonacci数列,也就是,第0,1项是1,然后后面的第i项为前面k项之和,即f[i]=f[i-1]+.....f[i-k],(i>=k+1),然后输入整数s,k,输出能使得加起来和为s的m(m>=2)个不同的k—Fibonacci数,1<=s<=10^9,k>1,考虑到k最小为2时,f[50]>=10^10,所以对于任意k,满足条件的整数不会超过10^9,只需要存储前50个就可以了。这样s依次减去小于它的最大Fibonacci值,直到s为0.

    题目要求最少输出2个数,所以遇到恰好为Fibonacci数的s值,可以输出一个0。

    代码:

     1 #include<stdio.h>
     2 #define max(a,b) ((a)>(b)?(a):(b))
     3 #define N 50
     4 typedef long long ll;
     5 ll f[N];
     6 int main(void)
     7 {
     8     int s,k;
     9     int i,j,ct=0;
    10     ll ans[N];
    11     scanf("%d%d",&s,&k);
    12      f[0]=f[1]=1;
    13      f[2]=2;
    14     for(i=3;i<N;i++)
    15     {
    16         if(i>=k+1)
    17             f[i]=2*f[i-1]-f[i-k-1];//i>=k+1,递推公式:f[i]=2*f[i-1]-f[i-k-1]
    18         else for(j=i-1;j>=max(i-k,0);j--)
    19             f[i]+=f[j];//否则f[i]为前面k项之和
    20     }
    21     for(i=N-1;i>0;i--)
    22     {
    23        if((s>=f[i]))
    24         {
    25             s-=f[i];
    26             ans[ct++]=f[i];
    27         }
    28         if(s==0)
    29         {
    30             if(ct==1){
    31                     printf("%d
    ",ct+1);
    32                 printf("0 ");
    33             }
    34             else printf("%d
    ",ct);
    35             for(i=0;i<ct;i++)
    36                 printf("%I64d%c",ans[i],i==ct-1?'
    ':' ');
    37             return 0;
    38         }
    39     }
    40         return 0;
    41 }
  • 相关阅读:
    博客园界面部分优化
    jQuery获取Select选择的Text和 Value
    java开发各层对象含义
    接口与抽象类的区别(完整描述)
    Map相关知识总结
    html引用外部js和css
    RDD内存迭代原理(Resilient Distributed Datasets)---弹性分布式数据集
    spark高可用集群搭建及运行测试
    spark集群的简单测试和基础命令的使用
    spark集群搭建
  • 原文地址:https://www.cnblogs.com/rootial/p/3205277.html
Copyright © 2011-2022 走看看