先考虑一个斐波那契数能分成其他斐波那契数的方案,假如f[i]表示第i个斐波那契数,那么只要对他进行拆分,f[i-1]这个数字必定会存在。知道这一点就可以进行递推了。先将数字分成最少项的斐波那契数之和,s[i]表示第i项的数字对应的斐波那契数编号,F[i]表示对不第i项进行拆分,G[i]表示对第i项进行拆分,g[i]表示对编号为i的斐波那契数拆分的话,有多少种方案。那么可以得到递推式:

F[i]=F[i-1]+G[i-1];
G[i]=F[i-1]*(g[s[i]-s[i-1]])+G[i-1]*(g[s[i]-s[i-1]+1]);

代码

 #include<cstdio>
#include<algorithm>
#include<iostream>
#define N 1000010
#define P 100000007
using namespace std;
long long n,f[N],Q,ans,g[N],F[N],G[N];
int s[N],tot;
int i;
int main()
{
f[]=;
f[]=;
Q=;
Q=Q*Q;
for (i=;i<=;i++)
{
f[i]=f[i-]+f[i-];
if (f[i]>Q) break;
}
g[]=;
for (i=;i<=;i++)
if (i%)
g[i]=g[i-]+;
else
g[i]=g[i-];
for (i=;i<=;i++)
g[i]--;
int test;
scanf("%d",&test);
while (test)
{
test--;tot=;
scanf("%I64d",&n);
for (i=;i>=;i--)
if (n-f[i]>=)
{
tot++;s[tot]=i;
n=n-f[i];
}
ans=;
F[tot]=;
G[tot]=g[s[tot]];
for (i=tot-;i>=;i--)
{
F[i]=F[i+]+G[i+];
G[i]=F[i+]*(g[s[i]-s[i+]])+G[i+]*(g[s[i]-s[i+]+]);
}
printf("%I64d\n",F[]+G[]);
}
}

Codeforces Beta Round #93 (Div. 1 Only) D. Fibonacci Sums的更多相关文章

  1. Codeforces Beta Round #93 (Div. 2 Only) (Virtual participation)

    A 相邻点对距离和*k B (Σ(v/2))/2 C 一直想不到"最优"是怎么体现的,发现y2=y1*(t1-t0)/(t0-t2),就写了1e6的枚举,然而又一些特殊情况没考虑到 ...

  2. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  3. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  4. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

  5. Codeforces Beta Round #77 (Div. 2 Only)

    Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...

  6. Codeforces Beta Round #76 (Div. 2 Only)

    Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...

  7. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

  8. Codeforces Beta Round #74 (Div. 2 Only)

    Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...

  9. Codeforces Beta Round #73 (Div. 2 Only)

    Codeforces Beta Round #73 (Div. 2 Only) http://codeforces.com/contest/88 A 模拟 #include<bits/stdc+ ...

随机推荐

  1. 深入了解Windows句柄到底是什么

    深入了解Windows句柄到底是什么 http://blog.csdn.net/wenzhou1219/article/details/17659485 总是有新入门的Windows程序员问我Wind ...

  2. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  3. 《linux内核设计与实现》读书笔记第一、二章

    第一章 Linux内核简介 1.1 Unix的历史 1971年,Unix被移植到PDP-11型机中. 1973年,Unix操作系统用C语言改写——为Unix系统的广泛移植铺平了道路. 1977年,伯克 ...

  4. Java 实现导出excel表 POI

    1.首先下载poi-3.6-20091214.jar 2.Student.java import java.util.Date; public class Student { private int ...

  5. Chip Factory---hdu5536(异或值最大,01字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题意:有一个数组a[], 包含n个数,从n个数中找到三个数使得 (a[i]+a[j])⊕a[k] ...

  6. Selenium2学习-021-WebUI自动化实战实例-019-设置浏览器窗口位置大小

    前文简略讲述了如何获取浏览器窗口的位置和大小,此文讲述如何通过 webdriver 设置浏览器窗口的位置和大小. 直接上码了...... /** * Set browser size for expe ...

  7. 如何将XML文件写入数据库

    将xml文件转成string public string XMLDocumentToString(XmlDocument doc) { MemoryStream stream = new Memory ...

  8. 如何将数据库中的表导成XML文件

    1.现将数据库中的信息读到DataTable中 2.用函数将DataTable转为string private string ConvertDataTableToXML(DataTable dt) { ...

  9. 替换SearchBar 键盘上的 搜索 按钮

    for (UIView *searchBarSubview in [searchBar subviews]) {        if ([searchBarSubview conformsToProt ...

  10. docker启动Mysql(转)

    cs202@cs202-devbox:~$ sudo docker run -d mysql7698fdd7a2d05d38cf19c60cc9e35c1117fc551ae5e31914494715 ...