随笔分类 - 组合数学
摘要:这题首先是找规律推公式,然后就是组合数学的知识了。 题目是问到第n行第m列的格式有几种方案,我们可以用手算的方法列出当n和m比较小时的所有答案 比如我列出以下8*8的矩阵 矩阵上的数表示从那个位置到最右下角一共有多少种方案。 求每个位置的值也简单,就是把它右下角的所有数加起来即可。 那么,把这个矩阵
阅读全文
摘要:这题的结果[f(1)+f(2)+...+f(n)]其实就等价于x*y*z<=n的解的个数,然后的方法几乎就是暴力枚举了。现场比赛的时候没想到这一点,太杯具了,浪费了两个小时的思考时间。其实我们的做法应该是可行的,因为f(n)具有积性性质,也就是若gcd(n, m)=1,则f(n*m)=f(n)*f(m)。而当p为质数时,f(p^k)=(k+1)*(k+2)/2,这样就能把f(n)数列的前n项和化成一堆多项式的加和。然后用合并同类项的思想,用容斥原理搞,可是代码量太大了,没打出来。。。今天赛题被挂到HDOJ上以后用上面说的枚举方法打了一下,交上去居然WA,调了半天也没发现错误,最后才怀疑是
阅读全文
摘要:这题公式不难推,就是控制精度的问题。因为公式是一些项求和,这里每一项都是接近于1的数,但是每一项里包含一个组合数和一个p^n,如果每次直接把p^n乘进去就会使数字太小,如果一直留到最后乘,可能中间就溢出了。解决的办法就是根据中间变量的大小动态地乘p^k,防止溢出,也防止数字太小丢精度离比赛结束已经有一段时间了,今天再来看这题,打算把它A掉,结果查了一下解题报告,发现这题其实有不需要控制精度的方法!!!唉,当时太SB了,这种方法居然都没想到,花了一两个小时去控制精度。其实只要在运算过程中全部取对数就可以了。。。。啊啊啊。。。/* * hdu4465/win.cpp * Created on: 2
阅读全文
摘要:类似于骨牌问题。我的做法就是首先看能不能横着排满,然后看能不能竖着排满,都不行的话就考虑一些横着排,一些竖着排,看能不能满足要求,最后也就转化为求ax+by=n有没有非负解的问题。可是我用扩展欧几里得打了,超时,无奈只能纯枚举了,枚举放1个、2个、3个...直到放不下为止。这说明测试数据很操蛋。/* * hdu2965/win.cpp * Created on: 2012-11-4 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath&
阅读全文
摘要:比赛的时候,2点半就想出该怎么做了,打代码打到3点半,还在调试,最可恨的是比赛结束还没过,一直WA,比赛完以后再测了测,发现是一处小错误。。。/* * A/win.cpp * Created on: 2012-9-8 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include
阅读全文
摘要:一直知道有这么个定理,但一直没理解,今天看了看书,差不多知道怎么用了,但证明还是完全不用会。。。用polya定理解题其实就是确定置换及其循环节。这题显然就是8个置换,四个旋转(其中一个为不动。。)和四个翻转,其循环节数分别为①n*n②(n*n+3)/4③(n*n+1)/2④同2⑤n+(n*n-n)/2⑥同5⑦奇数时n+(n*n-n)/2偶数时n*n/2⑧同7import java.io.*;import java.math.BigInteger;import java.util.*;public class Main { public static Scanner getFileScan...
阅读全文
摘要:这题是跟竹子compare时发现的,一直不会打代码,今天狠狠心学了学,打完了,可以加到模板里了。/* * hdu1796/win.cpp * Created on: 2012-8-20 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#i
阅读全文
摘要:简单,直接上代码/* * hdu2079/win.cpp * Created on: 2012-8-2 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#include <set>#include <map>#in
阅读全文
摘要:比较简单,直接贴代码/* * hdu2152/win.cpp * Created on: 2012-7-18 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <iostream>#include <algorithm>#include <queue>#include <set>#include <map>
阅读全文
摘要:首先要能推出公式,结果其实就是C(n,m),接下来求C(n,m)就用到了公式C(n,m)=C(n-1,m)+C(n-1,m-1)。我用记忆化搜索做的,觉得记忆化搜索写起来就是简捷啊~/* * hdu1799/win.cpp * Created on: 2011-10-3 * Author : ben */#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>#in
阅读全文
摘要:熟悉卡特兰数的人一眼就能看出这题该怎么做,恶心的是这题最大数据为35,结果在long long范围之内,可是如果用递推公式不当,运算过程中还会溢出。解决的办法是换一个递推公式,或者写成我下面这样/* * hdu2067/linux.c * Created on: 2011-7-31 * Author : ben */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>void work();int main() {#ifndef ONLINE_JUDGE
阅读全文
浙公网安备 33010602011771号