Codeforces 126D Fibonacci Sums 求n由任意的Sum(fib)的方法数 dp

题目链接:点击打开链接

题意:

给定一个数n

问把这个数拆成多个不相同的fibonacci数

有多少种拆法

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll __int64
#define N 90
ll n ,m;
ll f[N], dp[N][2]; //dp[i][0]表示不拆分下标为i的数 dp[i][1]表示拆分下标为i的数
vector<int>G;
int main(){
	ll i, j, u, v, T; cin>>T;
	f[1] = 1; f[2] = 2;
	for(i=3;i<N;i++)f[i] = f[i-1] + f[i-2];
	while(T--) {
		G.clear();	cin>>n;
		for(i = N-1; i; i--) {
			if(f[i]<=n) {
				G.push_back(i);
				n -= f[i];
			}
		}
		reverse(G.begin(), G.end());
		dp[0][0] = 1;
		dp[0][1] = (G[0]-1)>>1;
		for(ll i = 1; i < G.size(); i++) {
			dp[i][0] = dp[i-1][0] + dp[i-1][1];
			dp[i][1] = dp[i-1][0] * ((G[i]-G[i-1]-1)/2) + dp[i-1][1] * ((G[i]-G[i-1])/2);
		}
		cout<<dp[G.size()-1][0]+dp[G.size()-1][1]<<endl;
	}
	return 0;
}

Codeforces 126D Fibonacci Sums 求n由任意的Sum(fib)的方法数 dp

时间: 2024-11-08 07:12:34

Codeforces 126D Fibonacci Sums 求n由任意的Sum(fib)的方法数 dp的相关文章

CodeForces 837F - Prefix Sums | Educational Codeforces Round 26

按tutorial打的我血崩,死活挂第四组- - 思路来自FXXL /* CodeForces 837F - Prefix Sums [ 二分,组合数 ] | Educational Codeforces Round 26 题意: 设定数组 y = f(x) 使得 y[i] = sum(x[j]) (0 <= j < i) 求初始数组 A0 经过多少次 f(x) 后 会有一个元素 大于 k 分析: 考虑 A0 = {1, 0, 0, 0} A1 = {1, 1, 1, 1} -> {C(

Codeforces 10D LCIS 求最长公共上升子序列及输出这个子序列 dp

题目链接:点击打开链接 题意: 给定n长的一个序列 再给定k长的一个序列 求LCIS并输出这个子序列 如有多解输出任意解.. = - = 敲的时候听着小曲儿pre的含义还没有想清楚,万万没想到就过了... #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<mat

[CF126D]Fibonacci Sums/[BJOI2012]最多的方案

[CF126D]Fibonacci Sums/[BJOI2012]最多的方案 题目大意: 将\(n(n\le10^9)\)表示成若干个不同斐波那契数之和的形式,求方案数. 思路: 如果不考虑\(0\),则\(10^9\)以内的斐波那契数只有86个. 首先求出字典序最大的方案,考虑分裂里面的数. 用\(c_i\)表示字典序最大方案在斐波那契数列中的下标(递增),\(f_{i,j}\)表示考虑到第\(i\)个数,本身是否分裂的方案数. 转移方程为: \[ f_{i,0}=f_{i-1,0}+f_{i

求二叉树中任意两个结点的距离

求二叉树中任意两个结点的距离 实现步骤: 计算跟到第一个结点的距离: 计算跟到第二个结点的距离: 计算lca: 计算跟到lca结点的距离: 结果为(1) + (2) - 2 * (4),因为重复计算了两次的从跟到lca结点的距离: 1 class Node(object): def __init__(self, value=0): self.value = value self.left = self.right = None def get_path_length(root, n, path)

CodeForces 444C 节点更新求变化值的和

http://vjudge.net/problem/viewProblem.action?id=51622 题目大意: 给定一列n个数字,最初赋予值1到n 两个操作:1.将区间[l,r]内的数改为x,则这区间中所有数的改变值进行求和,即ans=abs(a[l]-x)+abs[a[l+1]-x).....abs(a[r]-x),但不要求输出 2.需要将刚才要求得到的区间改变值输出出来 这里我们利用一个color[]数组相当于给这堆数进行染色,当某个区间内的赋予的值相等时,我们可以看做有一个相同的c

求数组中任意两个数之间所有数字的和

303. Range Sum Query - Immutable   求数组中任意两个数之间所有数字的和 QuestionEditorial Solution My Submissions Total Accepted: 37248 Total Submissions: 146945 Difficulty: Easy Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j),

Floyd-Warshall求图中任意两点的最短路径

原创 除了DFS和BFS求图中最短路径的方法,算法Floyd-Warshall也可以求图中任意两点的最短路径. 从图中任取两点A.B,A到B的最短路径无非只有两种情况: 1:A直接到B这条路径即是最短路径(前提是存在此路径): 2:A先通过其他点,再由其他点到B. 我们并不知道A是否需要通过其他点间接到达B,所以只能比较,用A到B的直接路径和A先通过其他点 再间接到达B的路径长度进行比较,然后更新为较小值. 上图中若要求顶点4到顶点3的最短路径,可以比较顶点4直接到3的路径和顶点4先到1,再到3

Codeforces Beta Round #93 (Div. 1 Only) D. Fibonacci Sums

先考虑一个斐波那契数能分成其他斐波那契数的方案,假如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]*

hdu 2196 computer 求树上的任意最远点对 O(n)

题意: 给定n个结点,他们之间用n-1条边链接(这一点说明这个图的形状 就是一棵树 无环),给你一个结点,距离此节点最远的点与这个节点之间的距离. 解题思路: 经典的树上最长点对问题.不过带权,但是解决方法没有区别 首先找任意一个点,dfs()求出距离这个点的最远点END1 O(n) 然后从END1出发 再次dfs() 求出距离END1的最远点 期间经过每一个结点时,更新dist[i] (这个状态表示距离结点i的最远点到它的距离) 然后求出END2 从END2 再次出发 再遍历一遍所有结点 再次