2011年12月15日
摘要: UVA_10359 我们令f(n)表示有n列时的放置种数,那么我们不妨考虑左边第一个位置如何放置。实际上一共有三种情况,这样就可以得到f(n)=f(n-1)+2*f(n-2)。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[260]; ... 阅读全文
posted @ 2011-12-15 22:40 Staginner 阅读(252) 评论(0) 推荐(0) 编辑
摘要: UVA_10940 列举出前有限项就会发现规律,f(1)=1,f(n)=f(2^m+k)=2*k,其中k<=2^m<n。#include<stdio.h>#include<string.h>#define MAXD 500010int f[MAXD], N;void prepare(){ int i, k; k = 1; f[1] = 1; for(i = 2; i <= 500000; i ++) { if(k * 2 < i) k *= 2; f[i] = 2 * (i - k); }}int main(... 阅读全文
posted @ 2011-12-15 22:23 Staginner 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 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 阅读(206) 评论(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 阅读(514) 评论(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 阅读(672) 评论(0) 推荐(0) 编辑