09 2012 档案
【HDU】3441 Rotation
摘要:题意:给出A和C(1<=A,C<=10^9),所有满足B * B * K + 1 = A * A, (K >= 0)的B,构成边长为B的正方形,等角度的围绕在一个小正方形的周围。用C种颜色着色,边长为B的正方形旋转后相同视为相同的方案,整个图形绕中间的小正方形旋转后相同也视为相同的着色方案,求着色方案数。整体思路是:首先,忽略中间的小正方形,得到所有的B,求边长为B的着色的方案数X。其次,将每个B看成一个点,求用X种颜色对一个环着色的方案数。最后,将答案乘以C。要得到所有的B。由于A*A达10^18次方,根号n的复杂度寻找B肯定行不通。观察到B*B*K=A*A-1=(A+1)
阅读全文
【HDU】2865 Birthday Toy
摘要:题意:n个小圆组成的正n边形,中间有一个大圆。有木棍相连的两个圆不能有相同的颜色,旋转后相同视为相同的方案,求着色方案数。设有n个小圆,k种颜色(3<=N<=10^9, 4<=K<=10^9)。首先,很容易想到从k种选一种给大圆,然后用k-1种颜色对小圆着色。若不存在相邻圆颜色不同这个限制,则直接Burnside定理。若存在限制,但是颜色种数很少,可以构造矩阵然后快速幂,得到一个置换使着色不变的着色方案数。现在颜色种数很多,但是颜色限制较简单,可以考虑公式之类的。考虑将n个圆的环,等分成t部分,每部分有m个圆。F表示m个圆满足限制的着色方案数。若m=1,则F=0若m=2
阅读全文
【HDU】4187 Alphabet Soup
摘要:题意:一个圆上有n个点,用不同的角度表示,用k种颜色对n个点着色,旋转后相同视为同一种着色方案,问着色方案数。举几个例子:0 90000 180000 270000,每次旋转90度,每个点都能重合。0 45000 90000 180000 270000,无论怎么旋转,都不能重合。30000 150000 180000 330000,旋转180度才能重合。如何判断在旋转360度之内,能重合几次。将两个连续的点之间的角度差值处理出来,最多循环t次,那么有t个旋转使得重合。这可以用到next数组的性质。设当前得到a个循环,每个循环b个点。那么可以把b个点看成一个点,那么问题转化为a个点构成的环,着k
阅读全文
【HDU】3547 DIY Cube
摘要:题意:用k种颜色对立方体着色,旋转后相同视为相同的方案,求着色方案数。六个面,每个面为底可以有4个旋转,总共24种置换。初始时对下底面旋转有:x^8 + x^2 + x^4 + x^2将垂直于水平面的四个面翻转90度到底面,并有四个旋转:4*(x^2 + x^4 + x^4 + x^4)。将上底面旋转180度到下底面,并有四个旋转:x^4 + x^4 + x^4 + x^4。 1 import java.util.*; 2 import java.math.*; 3 4 public class Main { 5 public static void main(String[] ar...
阅读全文
【HDU】3923 Invoker
摘要:同【POJ】2409 Let it Bead只不过要求逆元。 1 #include<cstdio> 2 typedef long long LL; 3 #define MOD 1000000007 4 LL PowMod(LL a, LL b, LL c) { 5 LL ans; 6 a %= c; 7 for (ans = 1; b; b >>= 1) { 8 if (b & 1) { 9 ans *= a;10 ans %= c;11 }12 a *= a;13 ...
阅读全文
【HDU】1812 Count the Tetris
摘要:题意:n*n个方块组成的正方形,着k种颜色,旋转翻转视为相同的方案,有多少种方案。Burnside定理,一共有8个置换,每个置换统计一下不变的着色数即可。import java.util.*;import java.math.*;public class Main { static int Count1(int n) { int ans; if (n % 2 == 0) ans = 0; else ans = 1; for (n--; n > 0; n -= 2) a...
阅读全文
【HDU】2461 Rectangles
摘要:题意:不超过20个矩形,100000个询问,求矩形面积并。线段树复杂度比较靠谱吧。偷懒用容斥了。由于询问很多,容斥时候会重复用到某几个矩形的面积交,那么可以先预处理出来。询问的时候枚举子集肯定会TLE的,如果当前面积交为0,就不要再DFS下去了。这样就水过去了。 1 #include<cstdio> 2 #include<algorithm> 3 #define MAXN 20 4 #define MAX(a,b) ((a)>(b)?(a):(b)) 5 #define MIN(a,b) ((a)<(b)?(a):(b)) 6 #define oo 0x7F
阅读全文
【POJ】2888 Magic Bracelet
摘要:题意:m种珠子串成由n个珠子构成的环,并且有一些限制,比如第i种与第j种不能相邻,旋转后相同算是同一种方案,求方案数。(m<=10,n<=10^9)如果没有限制条件,可以很容易用Burnside定理+容斥得到答案。如果只考虑限制,观察发现,m很小,n很大。那么可以通过快速幂得到从第i种到第j种,共有k个珠子的方案数。再回到Burnside定理,显然有n种置换,现在问题是如何求每种置换能保持不变的着色方案数:在【POJ】2154 Color已经推出,第i种置换(即旋转360/n*i度)会有GCD(n,i)种不同的颜色,循环节长度为GCD(n,i)。就可以用快速幂得到从第i种回到第i种
阅读全文
【POJ】2154 Color
摘要:题意:n个珠子的环,之多着n种颜色,考虑旋转,不考虑翻转。问模P的方案数。运用Burnside定理,有n个置换,每个置换使得着色不变的着色个数有GCD(n,i)个。GCD(n,i)个的原因:【POJ】2409 Let it Bead由于n达到十亿,显然不能枚举。但是可以发现,GCD(n,i)即n约数的个数很少。问题转化为1~n有多少个数,使得GCD(n,i)=k。其中k是n的约数。这个问题等价于与n/k互质的个数有多少,那么容斥就能搞定。由于有模P,Burnside定理最后要除以n,但是n与P不一定互质,可能没有逆元。观察到分子,不妨先都除以n,就避免了这个问题。 1 #include<
阅读全文
【POJ】2409 Let it Bead
摘要:题意:用k种颜色对n个珠子构成的环上色,旋转翻转后相同的只算一种,求不等价的着色方案数。Burnside定理的应用:当n为奇数时,有n种翻转,每种翻转都是以一个顶点和该顶点对边的中点对称。有k^(n/2+1)*n种。当n为偶数时,有n种翻转,其中一半是以两个对应顶点,另一半是以两条对边对称。有k^(n/2+1)*n/2+k^(n/2)*n/2种。考虑旋转:枚举旋转角度360/n*i,(0<i<=n),也就是一个置换。经过该置换,颜色仍保持不变的着色方案有k^GCD(n,i)种。一个长度为n的环,每i个上同一种颜色,可以上多少种颜色。假设起点在x,则x,x+i,x+2*i,……,x+
阅读全文
【HDU】3208 Integer’s Power
摘要:题意:定义27的权为3,16的权为4(3^3=27,2^4=16)。求一个区间中所有数的权值之和。很容易知道[1,n]中有多少个数可以表示成k次方的形式,即n^(1/k)个。但是,一个数的平方包含了4 6 8 10……次方。如果知道至多只能表示成k次方的数有多少个,那么就能得到答案了。可以倒着容斥,如果正的推太复杂了。另外,pow精度不够,二分答案吧。 1 import java.util.*; 2 import java.math.*; 3 4 public class Main { 5 static int MAXN = 60; 6 7 static long Pow(...
阅读全文
【SGU】476 Coach's Trouble
摘要:题意:有3*n个人,分成n组,每组三个人。给出k个三元组,这三个人不可组队,问最后可以组队的总方案数。当k=0时,有(C[3*n][3]*C[3*n-3][3]*……*C[3][3])/n!种方案,展开以后可以得到dp[n]=(3*n)!/n!/6^n。显然可以写成递推式:dp[n]=dp[n-1]*(3*n-1)*(3*n-2)/2。那么容斥一下,答案=总方案数-至少含一个禁止组合的+至少含两个禁止组合的-……二进制暴力TLE了。DFS的话会有很多剪枝,当前几个已经出现冲突,自然不会再往后面搜了。 1 import java.util.*; 2 import java.math.*; 3 .
阅读全文
【POJ】1091 跳蚤
摘要:题意:有n张卡片,每张上的值可以相同,每张上的值不超过m,第n+1张为m。设k[i]为任意整数,a[i]为第i张卡片的值,那么问∑k[i]*a[i]=1的a[i]有多少种(0<=i<=n)。有式子可得n+1个数线性无关,即最大公约数必然等于1。总数是m^n,只要求得最大公约数不等于1的种数,就能得到答案。先对m分解素因子,例如12,有2,3。是2的倍数的有6个:2 4 8 6 10 12。是3的倍数的有4个:3 6 9 12。是6的倍数的有2个:6 12。所以与12不互质的有6+4-2=8个。import java.util.*;import java.math.*;public
阅读全文
【HUST】1214 Cubic-free numbers II
摘要:题意:给定一个区间,求不能表示成k*x*x*x(x>1)的个数。区间转化为两个1~n,可以先求出能够表示成k*x*x*x(x>1)的个数。不妨假设x是某个素数,1~n中有n/(x^3)个值,x^3,2*x^3,……,n/(x^3)*x^3。假设t不是素数,可以表示t=k*x。那么t^3=(k*x)^3=k^3*x^3。显然会与x统计重复。所以,可以枚举素数的三次方,得到一个答案。但是,6^3=(2^3)*(3^3),被计算了两次。因此,需要用到容斥原理。 1 #include<cstdio> 2 #include<cstring> 3 #include<
阅读全文
【URAL】1091 Tmutarakan Exams
摘要:题意:取k个不同的数,每个数不超过s,问种数。若kx1,kx2,...,kx3满足条件,则x1,x2,...,x3必然满足条件。因此枚举素数容斥,2*3*5*7>50,所以枚举之多三层。 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #define MAXN 60 5 typedef long long LL; 6 using namespace std; 7 bool p[MAXN]; 8 vector<int> prime; 9 LL C[MAXN][MAXN];
阅读全文
【ZOJ】3233 Lucky Number
摘要:题意:询问[low,high]中,A集合存在一个数是它的约数,且B集合存在一个数不是它的约数的个数。答案就是满足A条件的个数,减去满足A条件且不满足B条件的个数。 1 #include<cstdio> 2 #include<cmath> 3 #define MAXN 550 4 #define EPS 1e-8 5 typedef long long LL; 6 int n, m, a[MAXN], b[MAXN]; 7 LL low, high, lcm; 8 LL GCD(LL x, LL y) { 9 return y ? GCD(y, x % y) : x;10
阅读全文
【HDU】1695 GCD
摘要:题意:x在[a,b]内,y在[c,d]内,求GCD(x,y)=k的个数,题目保证a=c=1。由于GCD(x,y)=k,则GCD(x/k,y/k)=1。那么只要求x在[1,b/k]内,y在[1,d/k]内的互质对数,(x,y)与(y,x)是等价的。剩下的同【HDU】2841 Visible Trees。 1 #include<cstdio> 2 #include<vector> 3 #define MAXN 100010 4 typedef long long LL; 5 using namespace std; 6 vector<int> fac[MAXN]
阅读全文
【HDU】2841 Visible Trees
摘要:题意:n*m的格子,每个格子都种有一树,左下角坐标为(1,1)。问在(0,0)最多看到多少树。显然,若(x,y)能被看到,那么(k*x,k*y),其中k>1都不能被看到。因此,问题转化为求1<=x<=n且1<=y<=m有多个<x,y>满足gcd(x,y)=1。那么可以从1~n枚举x,累计1~m中与x互质的个数。对x分解素因子,容斥一下就好了。 1 #include<cstdio> 2 #include<vector> 3 #define MAXN 100010 4 typedef long long LL; 5 using na
阅读全文
【ZOJ】2836 Number Puzzle
摘要:题意:同【HDU】1796 How many integers can you find。 1 #include<cstdio> 2 #include<algorithm> 3 typedef long long LL; 4 #define MAXN 110 5 using namespace std; 6 int m; 7 LL n, ans; 8 int a[MAXN]; 9 LL GCD(LL x, LL y) {10 return y ? GCD(y, x % y) : x;11 }12 LL LCM(LL x, LL y) {13 return x / GCD
阅读全文
【HDU】1796 How many integers can you find
摘要:题意:给出n和m个元素的集合,求小于n且是集合中任意元素的倍数的数有多少个(m<=10)。最基础的容斥了,懒得DFS,直接枚举二进制暴力完事。 1 #include<cstdio> 2 #include<algorithm> 3 typedef long long LL; 4 #define MAXN 110 5 using namespace std; 6 int n, m, ans; 7 int a[MAXN]; 8 LL GCD(LL x, LL y) { 9 return y ? GCD(y, x % y) : x;10 }11 LL LCM(LL x,
阅读全文
【HDU】2204 Eddy's爱好
摘要:题意:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K(K>1)的数。我们可以由n^(1/p),知道指数为p的有多少个数。通过观察,可以发现若一个数可以表示成x^(k*t),则可以表示成(x^k)^t。因此指数必然为素数。枚举素数便可以得到指数为p的个数,但是可能出现重复,例如:x^3=y^5,其中x=t^5,y=t^3。运用容斥原理,设a[i]表示指数为第i个素数的个数,那么答案等于满足一个的,减去两个的,加上三个的……由于2^60>10^18,2*3*5*7>60,所以只要枚举到三即可。 1 #include<cstdio> 2 #include&l
阅读全文
【HDU】3976 Electric resistance
摘要:题意:给出一个图,无重边,边权为电阻大小,求1~n的等效电阻。要知道等效电阻,很显然要知道电流和电势差。电阻必然是确定的,那么电势差会随流过电流的大小变化,为了方便,不妨设流入1节点的电流为1,n节点的电势为0。每个节点的电势视为未知数,那么根据KCL,流入节点的电流必然等于流出节点的电流,列出n个方程。结果就是电势差/I。 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #define EPS 1e-8 6 #define MAXN
阅读全文
【POJ】2947 Widget Factory
摘要:列出同余方程,高斯消元。无穷解的同时,可能出现无解,所以先判无穷解,再判无解。最后枚举答案,还可能无解。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define MAXN 330 5 using namespace std; 6 int n, m; 7 int g[MAXN][MAXN], x[MAXN]; 8 int Day(char str[]) { 9 if (strcmp(str, "MON") == 0) 10 return 1; 11 if
阅读全文
【HDU】3571 N-dimensional Sphere
摘要:题意:给出n维的n+1个坐标,求一个坐标,使得n+1到该坐标的距离相等。距离定义为{(x1, x2 ... xN)| ∑(xi-Xi)^2 = R^2 (i=1,2,...,N) }首先,列出n+1个方程,显然二次项系数都为1,所以可以先把二次项消去,得到n个n元一次方程。然后,开始高斯消元。由于java在n=50时,很久都出不了答案,c++又会爆longlong,所以我们可以选择模P。ax=b的解等于ax=b(mod P)的解(x<P),这个很好证明。所以在模P下,加减乘除都很容易搞定。除法用乘以逆元,乘法用二分加法,拓展欧几里德部分的乘法是不会溢出的。为了方便处理,把输入所有的值加上
阅读全文
【POJ】2065 SETI
摘要:题意:直接拿样例,37 abc。a~z表示1~26,*表示0。x0*1^0+x1*1^1+x2*1^2=1(mod 37)x0*2^0+x1*2^1+x2*2^2=2(mod 37)x0*3^0+x1*3^1+x2*3^2=3(mod 37)高斯消元,除法x等于乘以x对p的逆元。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define MAXN 110 5 using namespace std; 6 char str[MAXN]; 7 int n, p; 8 int g[
阅读全文
【HDU】2449 Gauss Elimination
摘要:题意:给出n个未知数的方程组,求未知数。不是正数的用分数表示。赤裸裸的Java暴力,消元的时候用乘法相消,避免除法。 1 import java.util.*; 2 import java.math.*; 3 4 public class Main { 5 public static BigInteger g[][] = new BigInteger[110][110]; 6 7 public static boolean Gauss(int n) { 8 BigInteger tmp, a, b; 9 int i, j, k;10 ...
阅读全文
【HDU】3359 Kind of a Blur
摘要:题意:给出一个h*w的矩阵,每个值等于与它哈密顿距离不超过d的平均值,求原矩阵。构造方程组,高斯消元,注意行/列,消元要取最大的。 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #define MAXN 110 6 using namespace std; 7 double a[MAXN][MAXN], g[MAXN][MAXN], x[MAXN]; 8 int pos[MAXN][MAXN]; 9 int n, m, d, cnt
阅读全文
【HDU】3949 XOR
摘要:题意:有n个数,至少取一个异或可以得到一些值,询问这些值中第k小是多少。用高斯消元搞基。将n个数拆成二进制,转化为非线性相关。因此,这n个数都要尽可能小,且不能相互表示。不能相互表示,用高斯消元。尽可能小,则要从高位开始消去。 1 #include<cstdio> 2 #include<algorithm> 3 #define MAXN 10010 4 typedef long long LL; 5 using namespace std; 6 int n; 7 LL a[MAXN]; 8 void Gauss() { 9 int i, j, k, t;10 k = 0
阅读全文
【SGU】275 To xor or not to xor
摘要:题意:从n个数中,选择一些数,使得异或最大。将这些数转化为2进制。构造等式Ax=B,A是每个数字取或者不取,B不妨都设为1。为了使得异或最大,那么最高位尽可能为1。因此,从最高位开始尽可能使得等式成立,即当前处理第i个等式,则0~i-1个等式对第i个等式消元。若当前等式有解,ans|=1<<(60-i)。 1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 110 4 typedef long long LL; 5 int n, g[MAXN][MAXN]; 6 void Gauss() { 7 LL
阅读全文
【POJ】3185 The Water Bowls
摘要:题意:有20个数字,0或1。如果改变一个数的状态,它左右两边的两个数的状态也会变反。问从目标状态到全0,至少需要多少次操作。显然,问题可以从目标状态到全0 转化为 全0到目标状态。于是可以列出方程组,每行一个数的状态。为了知道操作次数,那么就要知道未知数为1有多少个,所以就要解方程组,解方程组就不得不枚举自由元了。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define MAXN 20 5 #define MAXM 25 6 #define oo 0x7FFFFFFF 7
阅读全文
【HDU】3364 Lanterns
摘要:题意:n盏灯,m个开关,每个开关控制一些灯。给出n个灯的状态,询问开关的方案数,使得达到给出的状态。灯的状态是由控制它的所有开关的状态异或而来,所以每个开关不是0,就是1。高斯消元后,等式左边系数全为0,等式右边系数不为0,显然无解。否则答案就是2^(自由元的个数)。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define MAXN 60 5 typedef long long LL; 6 using namespace std; 7 int g[MAXN][MAXN],
阅读全文
【HDU】3915 Game
摘要:题意:有n堆石子,每个人只能从某一堆至少拿走一个,不能拿者败。问事先拿走某些堆的石子,使得先手必败。由结论可知,石子数异或等于0时,先手必败。将石子拆成二进制,未知数为1表示保留该堆石子,为0表示事先拿走该堆石子。最后2^(自由元的个数)%MOD就是答案。 1 #include<cstdio> 2 #include<algorithm> 3 #define MAXN 110 4 #define MOD 1000007 5 using namespace std; 6 int a[MAXN], g[MAXN][MAXN]; 7 int Gauss(int n) { 8 i
阅读全文
【HDU】3727 Jewel
摘要:操作:1,从数列结尾插入一个数。2,查询区间第k小。3,查询一个数在当前序列是第几小。4,查询当前序列第k小。1,离线。因为结尾插入一个数并不会对当前查询的区间造成影响。2和4,划分树。3,其实就是划分树的逆过程。划分树就是二分一个区间,把小于等于区间中心的数放到左边,否则放到右边。同时还需要记录一个位置,在它位置之前(包括它的位置),有多少个被放到了左区间。当完全递归到区间长度是1时,就把一个数列排好序了。 1 #include<cstdio> 2 #include<algorithm> 3 #define MAXM 20 4 #define MAXN 300010
阅读全文
浙公网安备 33010602011771号