2013年5月16日

HDU-1695,欧拉函数,容斥定律。

摘要: 题意:给出x的范围(a,b),y的范围(c,d),在给出k。求满足gcd(x,y)=k的个数。x,y,范围不会超出100000,并且,a=c。如果gcd(x,y)=k,那么,gcd(x/k,y/k)=1,这就意味着,在区间(1,b/k),(1,d/k)有多小个数互质。这样,我们就有点思路了。我们大概了解欧拉函数。它是求前n-1个数与第个n数互质的个数。它有一个公式,简单讲述一下。一个合数可以分成若个质因子相乘。比如12=2*2*3*.由于2与2是相等的。变为合理的是12=3*2^2;那么对于任意一个数n,它可以写成n=(p1^k1)*(p2^k2)*p3.....(pi^kx).p1,p2.. 阅读全文

posted @ 2013-05-16 21:10 青竹士 阅读(227) 评论(0) 推荐(0) 编辑

2013年5月7日

poj2635-大进制转化+同余定理+素数筛选

摘要: 这题不知wA多小次了,先是打素数表超时,后是取余数超时。没法,在绝望的情况下看了大牛的,我无语了。。。。。题意:(英语基础不行,题意都很坑爹)。给你一个数,它是由两个素数相乘而得的,再给你一个数M,如果其中有一个素数小于该数M,就输出“BAD”,并且要输出该素数。只有两个素数都它大于这数M,才输出“GOOD”。(这题目废话真多!,何必呢?)分析题目:一看到素数,就想到了打素数表,这是解决这题的第一步,但怎样快速呢,又是一个麻烦事。另外,平时我们用的数都是十进制的数。所以,这题就要坑你,人是活的,想想看,为什么又二进制,八进制,十六进制。还不是处理方便些。计算机有点笨,它只认识1和0,如果数字很 阅读全文

posted @ 2013-05-07 20:05 青竹士 阅读(633) 评论(0) 推荐(0) 编辑

2013年4月29日

字符串的查找-hash和map

摘要: 对输入的字符串进行查找。题目:ZZ是ACM队的漂亮MM,虽然是一个屌丝ACMer,但是还是有一颗爱美的心。ZZ像所有的女孩子一样,喜欢买各种衣服,可是ZZ有个特别的习惯,就是不买同一个品牌的衣服,可是品牌那么多,怎么辨别哪些买过,哪些没有买过呢?这可难倒了ZZ,同作为ACMer的你,来帮帮ZZ吧!至今为止ZZ已经买过N个品牌的衣服,接下来还要一次一次的买M个品牌的衣服,请你告诉她,哪些能买哪些不能买吧!Input题目有多组测试数据,每组测试数据首先输入N和M,(0<=n,m<=100000)随后输入N个品牌,表示N个已经买过的品牌,紧跟着又有M个品牌,表示将要买的M个品牌。(品牌只 阅读全文

posted @ 2013-04-29 15:00 青竹士 阅读(688) 评论(0) 推荐(0) 编辑

2013年4月26日

生成最小树-prim,Kruskal算法

摘要: prim算法:一个辅助数组,用来记录当前到达其他点的最短路程,它是更新点,从第一个点出发,把数组w[]初始化,即第一个点到达其他点的路程,每次选取一个最小的点,在把我w[k]=0;然后再在改点选取比第一个到达其他点的最小值。即更新。Kruskal算法:用一个结构体来记录边的性质,边的两端和长度,先把边的长度排序,然后依次选取,在选取时,把边的两端赋值为相等,即代表了同一个分量,所以每次选取都要判断边的两端值是否相等。所以要用一个辅助数组来标记分量,根据MST性质,最短路程连接的点等于总共的点n-1个,如果用Kruskal算法,它的辅助数组的值将全部相等,这是Kruskal算法的技巧。而且更新恰 阅读全文

posted @ 2013-04-26 15:27 青竹士 阅读(1003) 评论(0) 推荐(0) 编辑

2013年4月19日

判断double型值是否相等。

摘要: 判断两个double型是否相等,不能用判断int型的方法去比较,这也是对初学者容易出现的错误,刚开始我在做PUK1730那个题目时候,就犯了这样的毛病。做出来的答案总是错的。因为我用double a,double b,if(a==b)...这样就是错的,后来在网上看了别人的代码才知道,比较两个double型:fabs(a-b)<=eps,(eps=1e-9),eps的值是起到精确度的作用。这大概是用到了极限的思想了。对PUK1730的题目,是要我们求a^b=c;求满足该等式下,b的最大值。输入c,输出b的最大值。本题由三个要注意的地方。1:输入的数很大,应用long long型。2:两个 阅读全文

posted @ 2013-04-19 19:46 青竹士 阅读(12125) 评论(0) 推荐(0) 编辑

2013年4月15日

大数求余。

摘要: 最初并没有在意一个数的求余运算。因为“%”就是求余的。而后来在一次比赛的题目上出了一道题就是求余。这是数很大位数可以达到1000位。我一看就蛋疼了。唉,别人都A了这道水题。我却无从下手。分析此题:把输入的当作字符串读入。再对取出每位减去48得到整型。然后应用同余定理,即可求出。如果知道这种方法,这题真的很水了。#include<stdio.h>#include<string.h> //本题应用了 (a*b)%c=((a%c)*(b%c))%c ;int row( int k,int n) //(a+b)%c=(a%... 阅读全文

posted @ 2013-04-15 21:22 青竹士 阅读(560) 评论(0) 推荐(0) 编辑

区间覆盖的判断技巧

摘要: 题意:有N个顶点,每个顶点有一个权值,初始值皆为0。接下来有M次操作,操作内容为 [a,b) or [b,a),将区间内顶点i 权值置为1,求最后顶点权值为0的数量。多组测试数据。第一行为两个整数n,m,n(1<=n<=20000)表示顶点,m(1<=m<=50000)表示操作次数。接下来包含m行,每行包含两个正整数a,b属于区间[1,n] ,意义如上所述。每组测试输出一行,包含一个整数,表示顶点值为0的数量。输入 3 1 1 2 3 1 1 3 输出 21分析:本题在于一个技巧,把要覆盖的区间头部+1,尾部-1,求没被覆盖的点,只要求和,判断sum[i]==0,如果是 阅读全文

posted @ 2013-04-15 21:10 青竹士 阅读(295) 评论(0) 推荐(0) 编辑

2013年4月14日

求01背包的第k大解

摘要: 这是一道求背包问题第k次大解。思路稍有点变法,就是在递归的过程中,分别用两个数组记录两种状态(选择或不选择),并且只要记录前k次。在这两个数组中都是前k次可能的最优解。所以我们只要把这两个数组做比较,一直排到k就行了,另外,对于递归问题,我们只要抓住某个状态的前后关系,把复杂问题简单化,不必去纠结全过程的状态,应为程序在运行时,递归过程是用堆栈实现的,其变化复杂,没必要每步弄懂。重点在于抓住前后规律和设计思路就可以了。#include<stdio.h>#include<string.h>int dp[1001][50],wi[100],di[100]; int n,m, 阅读全文

posted @ 2013-04-14 16:40 青竹士 阅读(248) 评论(1) 推荐(0) 编辑

ACM-josephus问题

摘要: View Code 1 #include<stdio.h> 2 #include<malloc.h> 3 typedef struct people 4 { 5 int num; 6 struct people *next; 7 }node; 8 void main() 9 {10 node *head,*p1,*p2;11 int n,m,i;12 while(scanf( "%d", &n )==1)13 { 14 head = p1 = (node *)malloc(sizeof(node)); 15 ... 阅读全文

posted @ 2013-04-14 13:32 青竹士 阅读(64) 评论(0) 推荐(0) 编辑

导航