UVa 948 - Fibonaccimal Base

题目:给你一个数字表示成fib数列元素加和的形式,如果有对应因子对应编号位为1,否则为0。

分析:Fib,数论。类似二进制数的表示方式。

算法1:已知正整数n;

                        while n <> 0
                                  找到第一个不大于自己的Fib数字Fk
                                  得到新的n = n - Fk
                         end while
                         输出所有找到的Fk

定理1:{F1,F2,..,Fn} 可以生成(某些元素和)1 ~ ΣFn之间的所有正整数。

证明1:1. {F1,F2}可以生成 1 ~ 3;

2. 设{F1,F2,..,Fn} 可以生成1 ~ ΣFn之间的所有正整数;

则{F1,F2,..,Fn,Fn+1} 可以生成1 + Fn+1 ~ ΣFn+1之间的所有正整数;

而Fn+1 = Fn + Fn-1 < ΣFn,所以也可以构成1 ~ Fn+1之间的所有正整数;

{F1,F2,..,Fn,Fn+1} 可以生成1 ~ ΣFn+1之间的所有正整数;

3.综上所述,定理成立。

推论1:任何正整数可以拆成某些Fib数字和的形式(不唯一);

推论2:求解Fib拆分的贪心算法正确(上面算法1);

上述算法一定有解,n∈[1,ΣFk],则n-Fk∈[1,ΣFk-1],证明如定理1;

说明:╮(╯▽╰)╭最近状态不好╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

int F[45],B[45];

int main()
{
	F[0] = F[1] = 1;
	for (int i = 2; i < 40; ++ i)
		F[i] = F[i-1] + F[i-2];

	int n,m;
	while (cin >> n)
	while (n --) {
		cin >> m;
		cout << m << " = ";
		for (int i = 39; i > 0; -- i) {
			if (F[i] <= m) {
				B[i] = 1;
				m -= F[i];
			}else B[i] = 0;
		}
		int move = 39;
		while (!B[move]) -- move;
		while (move > 0) cout << B[move --];
		cout << " (fib)" << endl;
	}
    return 0;
}
时间: 2024-11-14 16:18:01

UVa 948 - Fibonaccimal Base的相关文章

UVA 948 数的斐波那契进制表示

每个正整数都可以分解成斐波那契数列中的几个数相加-- 从大到小贪心法就可以了-- #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string

UVA948 Fibonaccimal Base【进制】

The well known Fibonacci sequence is obtained by starting with 0 and 1 and then adding the two last numbers to get the next one. For example the third number in the sequence is 1 (1=1+0), the forth is 2 (2=1+1), the fifth is 3 (3=2+1) and so on. Figu

UVa 343 - What Base Is This?

题目:已知两个数字串,问他们分别是多少进制时相等. 分析:简单题.直接枚举每个数字的不同进制(最大的数字+1 ~ 36),转换成10进制判断相等即可. 说明:数值转换到10进制时数字不超过整形范围. #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using

UVA 11121 Base -2

用负二进制表示一个数,如21=1+4+16,当num>21时最大用64-32表示32,否则最大用16即可,当num=31时,31-32=-1,在转入处理负数的函数中 1 /*0.003s*/ 2 #include <iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 8 int num,T,cas=1; 9 char an

uva 11595 - Crossing Streets EXTREME(切割多边形)

题目链接:uva 11595 - Crossing Streets EXTREME 对初始平面进行切割,得到所有平面,然后处理出所有边,有公共边的两个平面之间可以到达,对于城市的权值可以加到点上,进出各加一次即可. #include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <complex> #in

uva 1318 - Monster Trap(bfs+暴力)

题目链接:uva 1318 - Monster Trap 每条线段2个点,加上起点终点一个是202个点,暴力判断连点之间是否可达,可达建边.因为线段有厚度考虑,所以将线段延伸一点再处理,这样原本共用一端点的线段变成相交.特殊情况是三点共线,这是判断延伸后的点是否落在其他线段上,如果是就不考虑这个点.最后做一遍bfs. #include <cstdio> #include <cstring> #include <cmath> #include <vector>

UVA 10817 - Headmaster&#39;s Headache

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1758 状态压缩的DP,dp[i][st]表示状态为st考虑后面i个人所有人最小花费, 因为每个科目有三种状态,可以用一个三进制数表示, 状态不是很多,所以可以把预先把每个数的三进制预处理出来, 决策为选和不选. #include<bits/std

UVA - 10229 - Modular Fibonacci (矩阵快速幂 + fibonacci)

题目传送:UVA - 10229 思路:就是简单的矩阵快速幂求fibonacci数列,然后注意可能中间结果会爆int,因为2^19有50多万 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #includ

UVA 11990 ``Dynamic&#39;&#39; Inversion

26天以前做过的一道题,之前的做法是分治预处理,树套树在线修改,复杂度为O(nlogn+m*logn*logn),代码量较大. 本来想学习一下cdq分治的,看到论文上的凸包.斜率就暂时放一边了,只知道和一般的分治的不同是左子问题可以用来解决右边的子问题. 今天下午YY了一个离线的分治做法. 对于每一个数字,构成逆序对除了val大小还和被删除的时间del有关,这实际上是一个三维偏序的问题. 一个元素是一个三元组e(pos,val,del),e1和e2对答案有贡献当且仅当e1.pos < e1.po