2012年3月8日
摘要: HDU_3547 这个题目是《组合数学》上面的一个例题。 一开始我想的是任意一种旋转操作都可以是看成以沿穿过对面的中轴线的3种旋转操作组合而成的,只和操作的数量有关,而和操作的顺序无关,但后来很快发现了反例,于是如果再顺着这个思路考虑操作的顺序话,运算就相当庞大了。 于是还是不得不只从单一方向的旋转考虑。实际上旋转按旋转轴分类是有4种的: ①原地不动。 ②绕穿过对面的中轴线旋转。 ③绕穿过对棱的中轴线旋转。 ④绕正方体对角线旋转。 这4种情况一共包含了24种旋转操作,都考虑全面之后再应用大数运算就可以了。import java.math.BigInteger;import java.... 阅读全文
posted @ 2012-03-08 23:51 Staginner 阅读(491) 评论(0) 推荐(0)
摘要: HDU_3923 这个题目可以直接应用polya定理,但最后设计到一个带除法的表达式的取模问题。看了别人的解题报告后发现,应用完polya定理之后,需要计算的表达式就变成了ans/(2*m)%MOD,而2*m和MOD是互质的,所以可以先求出2*m关于模MOD的乘法逆元x,那么就有ans/(2*m)%MOD=ans*x/(2*m*x)%MOD=ans*x%MOD。 暂时还不明白为什么这么做可以,就先当结论记下了。#include<stdio.h>#include<string.h>#define D 1000000007int N, M;long long int pow 阅读全文
posted @ 2012-03-08 16:55 Staginner 阅读(353) 评论(0) 推荐(0)
摘要: POJ_2154 首先,直接应用polya定理就可以得到ans=(N^gcd(0,N)+N^gcd(1,N)+…+N^gcd(N-1,N))/N,如果直接计算的话,即便应用快速幂,也改变不了循环计算N项和的复杂度。 于是便不得不从gcd的值入手看是否能合并一些项达到化简的目的了。尽管一共有N项,但gcd的值一定到不了N项,因为gcd是N的约数,而一个数的约数是没有那么多的。顺着这个思路想的话,我们有没有办法更快地求得N的所有约数呢?这一点是可以在O(sqrt(N))的时间内办到的。我们只要枚举sqrt(N)以内的能够整除N的整数,就可以找到N所有的约数,如果同时我们可以O(1)的时间求出指.. 阅读全文
posted @ 2012-03-08 12:51 Staginner 阅读(488) 评论(0) 推荐(1)
摘要: POJ_2409 这个题目和POJ_1286很像,拿来练一下刚学的polya定理。#include<stdio.h>#include<string.h>#define MAXD 35long long int elem[MAXD];int C, S;long long int getpow(int i){ if(elem[i] != -1) return elem[i]; return elem[i] = getpow(i - 1) * C;}int gcd(int x, int y){ return y == 0 ? x : gcd(y, x % y);}vo... 阅读全文
posted @ 2012-03-08 00:14 Staginner 阅读(227) 评论(0) 推荐(0)