摘要: 容斥原理适用于 n个集合,已知每个集合的元素个数,以及任意个集合的交的元素个数,求所有集合并的元素的个数等问题。1.hdu 1659 这道题的知识点涉及到欧拉函数,容斥原理。 题意:给出(1,b),(1,d)两个区间,从中分别找出x,y,使得GCD(x,y)==k,要求得最多对数(x,y). 首先假定d>b,要求的GCD(x,y)==k 相当于求得GCD(x/k,y/k)==1,故转化为求(1,b/k),(1,d/k)中最多互质的(x,y)对数 b=b/k;d=d/k; 所以对于(1,d)中可分为两个区间 (1,b')+(b'+1,d) (由于b<d 故后一个区间可 阅读全文
posted @ 2012-07-30 20:39 hankers 阅读(301) 评论(0) 推荐(0) 编辑
摘要: 才知道之前学的信息安全数学基础在ACM中会有这么大的用处。之前校赛之前准备模板时看了这么几道题,借用一下网上的总结。1.素数,整数分解,欧拉函数 素数是可能数论里最永恒,最经典的问题了。素数的判断,筛法求素数,大素数的判断···还有很多其他问题都会用到素数。 *最水最水的:(心情不爽时用来解闷吧) pku1365 Prime Land pku2034 Anti-prime Sequences pku2739 Sum of Consecutive Prime Numbers pku3518 Prime Gap pku3126 Prime Path pku1595 P 阅读全文
posted @ 2012-03-23 23:06 hankers 阅读(383) 评论(0) 推荐(1) 编辑
摘要: 三维的BFS简单搜索,TLE了2次,边界问题少了dz的情况,还有注意简单的剪枝,像p.step>=time的情况就得剪去。学会发散思维,学了二维BFS就要想到三维的又该怎么去写。 1 #include<iostream> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 6 int map[51][51][51]; 7 int m[51][51][51]; 8 int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0 阅读全文
posted @ 2012-02-18 20:46 hankers 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 此题大意讲的是从起点到终点,要求若从A到B,则需保证A到终点的时间比B到终点时间要长。由于有此要求,必然想到动态规划记录其最短路线的状态,但传统动态规划却解决不了。故采用记忆化搜索,记忆化搜索=搜索形式+动态规划思想 1 #include<iostream> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 int map[51][51],m[51][51]; 6 __int64 s[51][51]; 7 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1 阅读全文
posted @ 2012-02-18 16:33 hankers 阅读(995) 评论(0) 推荐(0) 编辑
摘要: 此题大意讲的是有n种类型不同的砖块(a,b,c),且每种类型的砖块可以有无限个,垒高但要保证上面砖块的长宽小于下面砖块的长宽,求其最大高度。由于不确定a,b,c哪个为高,故扩展为3×n个砖块,若将砖块的长排序,只需比较宽。接下来就有点像背包了,从后往前一一确定当前状态下的最大高度。 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 struct block 6 { 7 int x,y,z; 8 }b[100]; 9 10 int max(int a,int b)11 {1 阅读全文
posted @ 2012-02-18 10:40 hankers 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 此题大意讲的是只能走黑砖,求他所能走的黑砖个数。这题让我很郁闷,写完了结果各种不对,最后才调试出原来我把行列的数搞反了,千万要细心!还有p=que.front();que.pop();这段代码只能放在循环内的前面,如若置于后面则还没有搜索完全就很容易跳出。 1 #include<iostream> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 6 char map[21][21]; 7 int m[21][21]; 8 int dir[4][2]={{1,0},{-1,0},{0 阅读全文
posted @ 2012-02-18 10:30 hankers 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 该题大意是套汇问题,货币根据汇率转换来套取多余的钱数,由于是各个货币两两转换,即由Floyd判环应用变形则可解决问题。Floyd算法用于解决任意两个节点之间的最短距离,判断是否成环等,其实质为动态规划。 1 /*Floyd算法的应用*/ 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 char cur[31][20]; 7 double map[31][31]; 8 9 int main()10 {11 int n,m,i,j,k,x,y, 阅读全文
posted @ 2012-02-17 18:25 hankers 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 这题就是简单的BFS搜索,刚刚转到C++,还有很多库函数不熟悉,理解到BFS是一种奇妙的迭代法,其用的主要是队列的性质。 1 /*BFS简单搜索*/ 2 #include<iostream> 3 #include<queue> 4 #include<cstring> 5 6 using namespace std; 7 8 int map[8][8];//标记数组 9 int dir[8][2]={{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}};10 11 struct point12 {13 阅读全文
posted @ 2012-02-16 23:18 hankers 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 该题纯属数学问题,已知不共线的三点,求这三点构成圆周周长通过这三点可求得三边a,b,c。利用余弦定理求得A的余弦值,再根据圆的性质之一:一段弧所对圆周角均相等,即可转化到该圆以a为直角边以d为斜边的直角三角形则d=a/cosA C=PI*d 1 #include<iostream> 2 #include<math.h> 3 #define PI 3.141592653589793 4 using namespace std; 5 int main() 6 { 7 double x0,x1,x2,y0,y1,y2,a,b,c,cosA; 8 while(scanf(&qu 阅读全文
posted @ 2012-02-16 16:38 hankers 阅读(411) 评论(1) 推荐(0) 编辑
摘要: 组合数学--Polya定理类型题总结:POJ 1286 Necklace of BeadsPOJ 2409 Let it BeadPOJ 2154 ColorPOJ 2888 Magic BraceletHDU 1812 Count the TetrisPolya定理:设G是n个对象的一个置换群,用m种颜色涂染这n个对象,则不同染色的方案数L=1/|G|*[m^p(a1)+m^p(a2)+....+m^p(an)].其中p(ai)是某个置换的循环数.1.旋转置换.我们假设依次顺时针旋转1~n个,则循环个数=gcd(i,n);2.翻转置换当n为偶数时,分两种情况,一种是中心轴在两个对称对象上,则 阅读全文
posted @ 2012-02-16 15:39 hankers 阅读(868) 评论(0) 推荐(0) 编辑