上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 85 下一页
  2012年5月22日
摘要: UVA_11255 应用burnside引理,关键在于对于每种置换求出不动方案的种数。import java.math.BigInteger;import java.util.Scanner;public class Main { static int MAXD = 50; static Scanner cin = new Scanner(System.in); static int N, P, pn; static int[] a = new int[5], b = new int[5], prime = new int[MAXD], p = new int[MAXD... 阅读全文
posted @ 2012-05-22 06:16 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
摘要: USTC_1130 时隔多日,回过头在再做这个题目时终于AC了,于是顿时觉得能力的提升确实需要时间的积淀。 首先,如果Alice会输,那么各个棋子所在位置的sg函数值的异或必然为0,于是我们可以先预处理出各个节点的sg函数值。 至于求方案,一开始的想法就是去dp了,比如用f[i][j][k]表示到第i个节点时放了j个棋子,且它们异或值为k的方案总数。这样i的上限是100,j是10000,k是128,这样的复杂度显然是不能承受的。 我们联想到异或的性质,偶数个同一个数的异或为0,因此,整个局面的sg函数值,实际上只与每个节点上棋子数目的奇偶性有关,而剩下的棋子则两个两个的看成一组,放在哪... 阅读全文
posted @ 2012-05-22 00:12 Staginner 阅读(155) 评论(0) 推荐(0) 编辑
  2012年5月21日
摘要: UVA_10601 对于一个立方体,一共有24种本质不同的旋转,整体上分为四类: ①静止不动; ②以某面与对面的中心的连线为轴,沿一个方向旋转90度、180度、270度; ③以某棱与对棱的中心的连线为轴,沿一个方向旋转180度; ④以某个顶点与对顶点的连线为轴,沿一个方向旋转60度、120度。 对于每类都可以用组合数计算出不动方案的种数,然后应用一下burnside引理就可以得到最后的结果了。#include<stdio.h>#include<string.h>int a[6], b[6], C[15][15];void prepare(){ int i, j; mem 阅读全文
posted @ 2012-05-21 11:01 Staginner 阅读(860) 评论(3) 推荐(1) 编辑
摘要: CSU_1027 对于一个立方体,一共有24种本质不同的旋转,整体上分为四类: ①静止不动; ②以某面与对面的中心的连线为轴,沿一个方向旋转90度、180度、270度; ③以某棱与对棱的中心的连线为轴,沿一个方向旋转180度; ④以某个顶点与对顶点的连线为轴,沿一个方向旋转60度、120度。 对于每类都可以用组合数计算出不动方案的种数,然后应用一下burnside引理就可以得到最后的结果了。#include<stdio.h>#include<string.h>#define MAXD 15010#define MOD 1000000007int N, M, a[10], 阅读全文
posted @ 2012-05-21 00:44 Staginner 阅读(283) 评论(1) 推荐(0) 编辑
  2012年5月18日
摘要: HDU_2481 由于需要处理循环同构的问题,明显需要用burnside引理,于是关键问题就在于对于一个N个约数R(表示一共有R个循环节),连续R个珠子一共可以形成多少种合法的方案。 这个让我联想到了之前做过的“FJOI 2007 轮状病毒”这个题目,不难发现连续R个珠子所能形成的合法方案,和R个珠子形成的轮状病毒的数目是一致的,因此我们完全可以把那个题目的递推式拿过来做dp的递推式,我推的递推公式在轮状病毒这个题目的解题报告里面:http://www.cnblogs.com/staginner/archive/2012/03/27/2420347.html,用这个递推式去dp的话需要构造4* 阅读全文
posted @ 2012-05-18 21:41 Staginner 阅读(523) 评论(0) 推荐(0) 编辑
  2012年5月17日
摘要: HDU_3441 首先声明一点,对于A=1的情况最好特判,因为有些处理措施对于A=1的情况会造成死循环从而TLE。 思路其实还算比较直接,但是处理起来比较繁琐。由于小正方形旋转同构,那么对于一个特定的B我们至少要先求得有多少本质不同的小正方形,这一点可以用polya定理计算出来。 接着,对于一组特定的B、K, 拼成的这个图形依然循环同构,但我们之前已经算出了有多少本质不同的小正方形,于是可以将这些本质不同的小正方形看成不同的颜色,于是再用一次polya定理就可以计算出结果。而中间那个单位正方形的颜色是无所谓的,所以结果要乘以C,这样就得到了一组B、K对应的结果。 那么剩下的问题就是如可去... 阅读全文
posted @ 2012-05-17 23:01 Staginner 阅读(373) 评论(0) 推荐(0) 编辑
摘要: HDU_2865 由于有相同颜色不能相邻这一限制,我们就需要用dp去计算burnside引理中的C(f)了。 按常规套路来,先将N的约数找到,接着对于每个任意约数R,就可以找到循环节数量为R的置换数了,然后需要用dp计算出对于有R个循环节的置换下的“不动方案”的数量。 首先,中间的圆圈的颜色是任意的,而且对于每种颜色而言“不动方案”的数量是一致的,也就是说中间的圆圈有K个颜色可选,而我们只需要计算任意一个情况就可以了,最后乘K就是总数。 接下来小圆圈就剩下K-1个颜色可选了,而我们需要计算长度为R的一串珠子的合法方案数,所谓合法就是相邻的珠子不能同色,以及首尾珠子不能同色。这时第1个珠子有.. 阅读全文
posted @ 2012-05-17 13:07 Staginner 阅读(423) 评论(0) 推荐(0) 编辑
摘要: POJ_2888 自己一开始学polya的时候还是太浮躁了,只是相当于背过了个公式而已,其实根本没建立在理解的基础之上。今天踏下心来又看了一遍黑书,终于能够自己根据burnside引理来推导出polya公式了。 解决这个题目首先要了解burnside引理的内容,接着就是用dp的方法去具体计算黑书上所谓的C(f)(在置换f下保持不变的着色方案数)了。最后的结果是C(f)的平均值,也就是C(f)/N,由于9973和N互质,所以可以先求N的逆元,进一步就可以得到(C(f)/N)%9973的值了。 推荐一个此题讲解得非常详细的博客:http://hi.baidu.com/billdu/item/623 阅读全文
posted @ 2012-05-17 01:23 Staginner 阅读(585) 评论(0) 推荐(0) 编辑
  2012年5月14日
摘要: POJ_2728 最优比率生成树问题,黑书上有详细的介绍,在求的时候可以直接二分K,也可以先假定一个K然后求得一个新的K,如此反复迭代下去。 对于这个题而言,如果直接二分的话,大概二分50次就可以保证精度了,而迭代的话大概10次就可以保证精度了,所以迭代的效率还是高一些。View Code 直接二分#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>#define MAXD 1010#define INF 0x3f3f3f3fusing namespace s 阅读全文
posted @ 2012-05-14 11:12 Staginner 阅读(294) 评论(0) 推荐(0) 编辑
  2012年5月13日
摘要: SGU_275 这个题目可以将每个数分解成64位来看待,于是我们可以从高位向低位扫描,尽可能让当前这位为1,而判断当前这位是否可能为1可以借助高斯消元。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 110#define MAXM 70using namespace std;long long a[MAXN];int N, mat[MAXM][MAXN], code[MAXM][MAXN], ans[MAXM];void decode(int i){ int j; long 阅读全文
posted @ 2012-05-13 22:32 Staginner 阅读(599) 评论(0) 推荐(0) 编辑
上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 85 下一页