上一页 1 ··· 52 53 54 55 56 57 58 59 60 ··· 85 下一页
  2011年12月15日
摘要: UVA_10079 我们在切第n刀的时候最多和n-1条直线有n-1个交点,并新开辟出n个新的小区域,那么就有f(n)=f(n-1)+n,进而就可得到f(n)=n*(n+1)/2+1。#include<stdio.h>#include<string.h>long long int N;int main(){ for(;;) { scanf("%lld", &N); if(N < 0) break; printf("%lld\n", (N * N + N) / 2 + 1); } return 0;} 阅读全文
posted @ 2011-12-15 22:10 Staginner 阅读(207) 评论(0) 推荐(0) 编辑
摘要: UVA_991 我们固定一个点之后,枚举这个点的握手对象就会发现f(n)=f(0)*f(n-1)+f(1)*f(n-2)+…+f(n-1)*f(0),做f(n)=p(n+1)的转化就会发现p(n)是卡特兰数,那么f(n)的递推公式自然就可以得到了。#include<stdio.h>#include<string.h>#define MAXD 15long long int h[MAXD];int main(){ int i, n, t = 0; h[1] = 1; for(i = 2; i <= 10; i ++) h[i] = h[i - 1] * (4 * . 阅读全文
posted @ 2011-12-15 22:07 Staginner 阅读(454) 评论(0) 推荐(0) 编辑
摘要: UVA_763 这个AC得有点晕晕乎乎的,我只是找到了一个可行的方式可以构造出来结果。首先我们可以看到,input的序列实际上代表着每一个斐波那契数的数量0或者1,那么它们之间的运算应该也满足斐波那契通项的运算f(n)=f(n-1)+f(n-2)。在纸上画了一下,发现对于任意一个局部而言,也就两种形式的运算。 ①例如001+010=100,或者写成011=100,这个就对应着f(n-1)+f(n-2)=f(n)。 ②例如0100+0100=1001,或者写成0200=1001,这个就对应这f(n)+f(n)=f(n)+f(n-1)+f(n-2)=f(n+1)+f(n-2)。当然这个式子根据.. 阅读全文
posted @ 2011-12-15 15:21 Staginner 阅读(517) 评论(0) 推荐(0) 编辑
摘要: UVA_10229 将斐波那契数用矩阵形式表示,然后再做快速幂取模即可。#include<stdio.h>#include<string.h>#define MAXD 50long long int N, M, D, a[MAXD][4], b[4];void pow_mod(long long int n, int e){ if(n == 1) { a[e][0] = a[e][1] = a[e][2] = 1; a[e][3] = 0; return ; } pow_mod(n / 2, e + 1); a[e][0]... 阅读全文
posted @ 2011-12-15 14:35 Staginner 阅读(440) 评论(0) 推荐(0) 编辑
摘要: UVA_10334 这个题目多列几项就可以猜出来是fibonacci数列。 如果要证明的话,我们不妨来看下折射次数为n的光线是怎么构成的,实际上它们都是在折射次数为n-1的最终的射出光线与3条横线的交点位置反向画一条射出光线形成的。 因此,我们可以得知折射次数为n-1的所有光路中的最终的射出光线与横线的交点的数量就是折射次数为n的光路的总数。 按交点的性质可以分成两类,我们不妨以x表示射出光线与中间那条横线形成的交点数,以y表示射出光线与两边横线形成的交点数。我们不难发现,对于在每一个x类交点处画反向射出光线时可以形成一个y类交点,对于在每一个y类交点处画反向射出光线时可以同时形成一个x... 阅读全文
posted @ 2011-12-15 14:34 Staginner 阅读(369) 评论(0) 推荐(0) 编辑
摘要: UVA_10862 我们不妨设f(n)为n个方块时情况的种数,那么我们不妨从f(n-1)入手,在后面添加第n个方块,看看一共有多少种添加进去的方式。 为了讨论的方便,我们对第n个方块标号为1,第n-1个标号为2,等等,然后画出下面这个图。 (圆圈) 方块n …… 方块3 方块2 方块1 首先,方块1是可以在f(n-1)的基础之上连上圆圈,这样就有f(n-1)情况了,其次方块1可以在f(n-1)的基础之上连上方块2,这样就又有了f(n-1)种情况。 当然,还有最后一种情况,就是方块1既和方块2连在一起,又和圆圈连在一起,这时f(n-1)的图里必须删掉一条边,但如果我们从删边... 阅读全文
posted @ 2011-12-15 14:33 Staginner 阅读(675) 评论(0) 推荐(0) 编辑
  2011年12月14日
摘要: UVA_10518 这个题目想到f(n)=f(n-1)+f(n-2)+1还是比较容易的,但如果能想到是f(n)=2*F(n)-1就不太容易了,在看了UVA的论坛之后我才知道原来可以表示成这个样子,其中F(n)为斐波那契数,有了这个式子是第一步,后面的计算过程倒还不算麻烦。 后来在群里讨论的时候,突然发现S(n)=F(n)+F(n+1)-1,S(n)为斐波那契的前n项和,这时又想到我之前推到的一个结论f(n)=S(n)-F(n-1),发现这个和f(n)=2*F(n)-1是可以转化的,限于当时还不知道S(n)的表达式,所以错过了推出结论的机会。 先说说我推出f(n)=S(n)-F(n)的过程吧,. 阅读全文
posted @ 2011-12-14 23:09 Staginner 阅读(671) 评论(0) 推荐(1) 编辑
摘要: UVA_10303 不妨设f[i]表示一共有i个元素的时候的二叉搜索树的个数,那么我们依次取1-n作为根就会得到f[n]=f[0]*f[n-1]+f[1]*f[n-2]+…+f[n-1]*f[0],如果我们稍加变形,做一个f[n]=p[n+1]的映射,就会发现f[n]=p[n+1]=p[1]*p[n]+p[2]*p[n-1]+…+p[n]*p[1],这样右边就变成卡特兰数了,于是我们也就算找到了f[n]和卡特兰数的通项p[n]的关系,即f[n]=p[n+1]。 又因为p[1]=1,p[2]=1,所以p[n]=(4n-6)/n*p[n-1],f[n]=(4n-2)/(n+1)*f[n-1]imp 阅读全文
posted @ 2011-12-14 19:27 Staginner 阅读(497) 评论(0) 推荐(0) 编辑
摘要: UVA_10183 根据通项公式粗略计算一下,我们可以知道10^100内的斐波那契数不会超过600个,因此只需要预处理出这些斐波那契数并扫描一遍即可知道在指定范围内的个数。import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); BigInteger[] f = new BigInteger[600]; ... 阅读全文
posted @ 2011-12-14 17:25 Staginner 阅读(413) 评论(0) 推荐(0) 编辑
摘要: UVA_10417 如果我们设事件Ai为第1个人带来的是第i类gift,事件B为所有人的gift放一起呈现出题目中给出的每类多少个那种状态。那么P(Ai|B)就对应表示在当前这种状态下第1个人带来的是第i类gift的概率,那么剩下的问题就是把这个概率算出来就好了,然后除以第i类gift的个数就是拿1个第i类的gift且拿成功的概率。 根据条件概率的公式有P(Ai|B)=P(AiB)/P(B),P(AiB)表示事件Ai和B同时发生的概率。由于原始gift状态的子状态个数有限,我们可以指定一个放礼物的顺序(或者拿礼物的顺序)然后进行动规来求各个状态的概率即可。 于是我们不妨规定从第一个人开始,.. 阅读全文
posted @ 2011-12-14 16:50 Staginner 阅读(437) 评论(0) 推荐(0) 编辑
上一页 1 ··· 52 53 54 55 56 57 58 59 60 ··· 85 下一页