- 博客(51)
- 资源 (1)
- 收藏
- 关注
原创 hdu 3929 Big Coefficients(Lucas定理+容斥原理)
题意:求F(x) = (1+x)^a1 + (1+x)^a2 + ... + (1+x)^am.中系数为奇数的项的个数。思路:由Lucas定理可知,(1+x)^n中奇数项的个数等于2^(n的二进制表示中1的个数)。Lucas定理相关证明可以看这里。然后就是利用容斥原理,把重复的减去,两项相交的结果中奇数项的个数为2^(a[i]&a[j]的二进制表示中1的个数)。需要注意的是,由于偶数个奇数项在
2014-03-31 20:52:32 1083
原创 Lucas定理相关证明
做题的时候遇到了这个东西,感觉网上关于这个的证明很少,于是打算写一篇,由于本人能力有限,证明是看了《命题人讲座初等数论》和http://hi.baidu.com/j_mat/item/8e3a891c258c4fe9dceecaba后根据自己理解写的,有不对之处还望大家指出,转载请注明出处,谢谢http://blog.csdn.net/qian99?viewmode=contents。博客上编辑公
2014-03-31 20:37:35 1392 1
原创 poj 2773 Happy 2006(容斥原理)
题意:求和m互质的第k个数是多少。思路:假设我们要求的数是n,那么如何求n之前有多少个数和m互质呢?这个问题直接算不好算,根据减法原理,我们可以求出和m不互质的数,然后用n减去,就可以得到和n互质的数的个数了。假设和m的质因子分别为q1,q2,q3……那么能整除q1的数就有n/q1个,能整除q2的数有n/q2个……将这些数加起来,但是会有重复的,比如能被q1和q2同时整除的被加了两次,这部分要
2014-03-29 16:34:33 854
原创 poj 1019 Number Sequence
题意:[1,i]表示从1到i的数列出来的数列,比如[1,3]是123。现在将[1,i]按顺序列出来,问第n位的数字是什么。思路:我直接模拟的?大概就是把[1,i]作为一组,然后不断减去这一组的长度。然后找到n是在哪个[1,i]中,然后再去里面找。。。看了看网上的代码,貌似没有我这么简单粗暴的,一般都弄了些预处理,还有二分的。。。代码:#include#include#inc
2014-03-29 10:10:33 566
原创 poj 3252 Round Numbers(数位dp+组合计数)
题意:询问区间[L,R]内中的二进制数0>=1的数的个数。思路:网上很多都直接推导一下就算出来了。。。。我只会用数位dp搞一下,再计数Orz……觉得自己数学思维实在太差了、、、、dp[i][j][k]表示当前在第i位,前面的有j个0,有k个1的合法的数有多少个。当前面有1的时候,可以算一下至少需要多少个0才能满足要求,比如现在有n位,至少需要m个0,那么结果就为 Σ{i=m to n}(C[n
2014-03-28 20:07:39 596
原创 zoj 3268 Treasure Hunt III (dp)
题意:有1~n个房间形成一个环形,每个房间有一个宝藏,当取走当前房间的宝藏后,两边房间的宝藏就会消失,现在在房间S,有T秒时间,问最多能获得多少宝藏,从一个房间到另一个房间需要1单位时间。思路:dp[i][j]表示第i个房间拿或不拿能获得的最大值。dp方程比较好想,dp[i][0]=max(dp[i-1][0],dp[i-1][1]),dp[i][1]=dp[i-1][0]+val[i]。然后
2014-03-28 12:23:48 557
原创 CF 367C Sereja and the Arrangement of Numbers(欧拉路径)
题意:给出m个不同的数,并且每个数都有个费用,现在要在m个数中选择一些数,用这些数组成一个长度为n的数列,并且满足任意两个不同种类的数都相邻。问最大的费用是多少。思路:不同种数的区别只有费用,不妨按费用从大到小排序,现在就是要在前几个数中选一些满足要求。可以把它想象成一个图,每个数代表一个顶点,两个数相邻代表两个顶点之间有条边,根据题中的要求,构造出来的图就是完全图。做题的时候没想那么多,找了
2014-03-27 17:40:29 981
原创 zoj 3630 Information (tarjan+枚举)
题意:给出一个有向图,现在要删掉一个点,使得点数最多的强连通分量的点数最小。思路:直接枚举删掉的点就行。。。做的时候总担心会超时,就写的麻烦了,先找了遍连通分量,然后再每个连通分量内枚举点。。。其实复杂度应该是一样的,写着写着感觉直接枚举也没问题,但懒得改了~代码:#include#include#include#include#include#include#in
2014-03-26 18:52:40 568
原创 zoj 3632 Watermelon Full of Water(DP+线段树)
题意:有个人每天都要吃西瓜。。。每天的西瓜的价钱不同,买了西瓜后,最多可以吃ti天,每天最多买一个西瓜,如果一天买了一个西瓜,那么之前买的就要丢掉。问n天花掉的最少多少钱能保证这个人每天都能吃到西瓜。思路:dp方程还是挺好想的。dp[i][j]表示在第i天是否买西瓜所花费的最小价值,dp[i][1]=min(dp[i-1][0],dp[i-1][1])+val[i]。dp[i][0]=min(
2014-03-26 18:44:12 715
原创 zoj 3626 Treasure Hunt I(树背包)
题意:给出一棵树,从节点s开始,有时间T,每个结点有一些财富值,走每条边有一定时间,问从s开始,在T时间内,获得结点的财富并返回s所能得到的最大价值。思路:比较简单的树+01背包。。dp[u][m]表示在结点u用m的时间能获得的最大价值。代码:#include#include#include#include#include#include#include#include
2014-03-26 18:35:19 610
原创 [2009国家集训队]小Z的袜子(hose)(莫队算法)
之前做的一道CF题就是这样的,这题还要简单一点,把查询分块,不同块的按块排序,同一块的按右区间排序。每次把当前的区间[L,R]调整到目标区间[L',R'],然后计算就行了。代码:#include#include#include#include#include#include#include#include#include#include#include#def
2014-03-25 15:21:07 727
原创 UVALive 3295 Counting Triangles(组合计数)
题意:给出一个m×n的网格点中能组成的三角形的个数。思路:直接算很难入手,可以发现任意三个点可以组成一个三角形当且仅当三点不共线,因此可以用总的方案数-三点共线的方案数。三点形成的直线是水平或者垂直的很好算。主要问题是不共线的方案的计数,受之前做的UVALive 3295 Counting Triangles的启发,用dp[i][j]表示以(0,0)为左上角,(i,j)为右下角的矩形中三点共
2014-03-25 10:42:54 911
原创 hdu 2473 Junk-Mail Filter(并查集)
题意:给出n个点,有两个操作,一个是把两个点合并,另一个是把某个点移出集合,求所有操作进行后集合的个数。思路:这题前几天FOJ月赛的时候看到过,原来是08年Regional的题。。。合并好说,把结点移出集合就有些麻烦了,因为这个结点可能是其它点的父节点,为了不出现这种问题,可以设一个虚拟结点,把所有点连到虚拟结点上,这样移除的时候就不用考虑那么多了。需要注意的是本来就是单独的结点不需要移出,一
2014-03-24 20:51:50 871
原创 UVALive 3720 Highways(组合计数、递推)
题意:n行m列的点阵,问有多少非垂直并且非水平的直线至少穿过点阵中的两个点。思路:第一眼看的时候感觉和一道平面坐标中能看到点的题挺像的,于是按着那题的思路推了个用欧拉公式算的。写完以后发现不对,欧拉公式推的并不能包含所有情况,而且会有重复统计的问题。换个思路,想到了用几个矩阵组合出答案的方法,首先只考虑一个方向的直线(如斜率小于0的),则a[i][j]=a[i-1][j]+a[i][j-1]-
2014-03-24 18:29:51 884
原创 UVA 11038 How Many O's(数位dp)
题意:查询区间[n,m]中的数有多少个0。思路:数位dp,dp[i][j][k]表示前i位,已经有了j个0,前面是否都是0,这样的数的所有0的个数。代码:#include#include#include#include#include#include#include#include#include#include#include#define inf 0x
2014-03-23 19:12:49 768
原创 poj 2151 Check the difficulty of problems(概率dp)
题意:给出有M道题,T个队伍,和一个值N。给出每个队答对每一题的概率,现在要求满足下面两个条件的概率:①每个队至少做出一道题②做出最多题的队伍做题数不能小于N思路:可以转化成所有队伍至少做出一道题的概率-所有队伍做题数都大于等于1并且小于N的概率。这个可以用dp求出,dp[i][j]表示前i题做出j道的概率。代码:#include#include#include#
2014-03-21 19:15:24 592
原创 zoj 3641 Information Sharing(并查集)
题意:给出n个操作,操作有的三种:①添加一个人,这个人携带了一些信息。②分享某两个人的信息。③查询某个人所拥有的不同的信息的个数。思路:其实就是个并查集,用个set来记录每个人所拥有的信息,当两个人分享信息时,将这两个人合并,把一个人的信息都添加到另一个人上面,然后把这个拥有的信息删除。代码:#include#include#include#include#incl
2014-03-19 18:49:35 840
原创 zoj 3640 Help Me Escape(概率dp)
题意:一个人在一个有N条道路的地方,每天他会被随机传送到任意一条道路,每个道路有一个危险值ci,他有个战斗力f,如果f>ci,那么在战斗ti天后会出去,否则f会增加ci,第二天继续这个过程,问他出去的天数的期望。思路:比较简单的概率dp吧,dp[x]表示战斗力为x时出去的天数的期望。如果x>max{ci},那么天数的期望就为1/n*Σti,否则,dp[x]=1/n*Σti(x>ci)+1/n*
2014-03-19 18:42:04 607
原创 zoj 3637 Education Manage System(dp)
题意:给出n个课的开始时间和结束时间和学分,两节课之间至少休息5分钟,问如何排课使得学分最多。思路:其实看懂了题以后就会发现这是个简单的dp,但是时间的处理之类的东西还是挺烦的。。。把课按结束时间排序,用dp[i]表示以第i节课为结尾的排课方式最多能获得的学分,maxv[i]表示以i或小于i的课为结点为结尾的排课方式能获得的最多学分,则dp[i]=maxv[p]+dp[i],p表示能作为i的前
2014-03-19 18:27:40 749
原创 zoj 3633 Alice's present(离线+线段树)
题意:给出区间[L,R],从右向左检查,找到第一个重复的值。思路:首先把每个值离散化,将查询按R排序保存。依次把1~n中的数x插入线段树,令v=num[i],用pre[v]表示上一次出现的v这个值的位置,用last[v]表示再上一次出现的位置。把last[v]赋值为0,pre[v]的值赋值为1,pre[v]=x。这样,对于每个以i为右端点的查询,第一个重复的就是这个区间中最右边的1的位置,这个
2014-03-19 18:19:06 574
原创 hdu 4405 Aeroplane chess(概率dp)
题意:一个人玩飞行棋,每次走掷的骰子点数歩,地图上有些地方可以直接传送,问期望的掷骰子次数。思路:直接搞就行,没什么坑,遇到有传送的位置直接传就行,刚开始没看到X代码:#pragma comment(linker, "/STACK:102400000,102400000")#include#include#include#include#include#include#i
2014-03-18 16:18:00 654
原创 zoj 3329 One Person Game(概率dp)
题意:三个骰子,这三个骰子有K1、K2、K3个面,cnt最开始等于0,同时掷3个骰子,如果这三个骰子分别为a,b,c,那么cnt=0,否则cnt+=(a+b+c)。如果cnt思路:最开始推完方程以后发现存在一个E(0)的常数,本来想用直接用dp[i]表示dp[i]-E[0],后来发现不行,因为最后边界的位置就错了。正确的姿势是把E(i)表示为E(i)=A[i]*E[0]+B[i],然后转化为求
2014-03-18 11:33:54 546
原创 poj 3744 Scout YYF I(概率dp+矩阵快速幂)
题意:有个人从1位置开始走,每次走1歩的概率为p,走两步的概率为1-p,在N个位置上有地雷,问这个人不踩到地雷通过的概率。思路:可以看出安全走到某一位置的概率f(x)=f(x-1)*p+f(x-2)*(1-p)。类似fibonacci的这么个东西,然后用矩阵快速幂计算到达每个雷的位置的概率和前一个位置的概率。走到最后,结果为安全到达最后一个雷前一个位置的概率×(1-p),也就是要跳过那个雷。
2014-03-17 20:48:41 774
原创 poj 2096 Collecting Bugs(概率dp)
题意:Ivan每天能找到一个bug,现在有一个工程,有n种bug,s个子系统。问在这个工程中找出n种bug并且每个子系统至少有1个bug的天数的期望是多少。思路:用dp[i][j]表示当前找出了i种bug,这些bug在j个子系统中,那么再找一个bug可能的情况有下面几种。①找到的这个bug不在找到的i种bug中,但是在已经出现bug的j个子系统中。②找到的这个bug在找到的i种bug中
2014-03-17 19:45:29 609
原创 poj 3071 Football(概率dp)
题意:2^n个队伍进行淘汰赛,给出任意两个队中每队获胜的概率,问哪个队伍获胜的概率最大。思路:还是比较简单的概率dp吧,写完以后看了看网上的题解,发现我的写法和他们都不太一样,不过原理都一样。。。我是直接把比赛的过程建成一棵树,最上面的节点就是最终的比赛,有点像线段树。dp[i][j]表示在结点i,队伍j获胜的概率。代码:#include#include#include#
2014-03-17 17:27:07 584
原创 SGU 495 Kids and Prizes(概率dp)
题意:一个房间有n个盒子,最开始每个盒子都有礼物,现在有m个人进去挑一个盒子,如果这个盒子没被人选过,那么他就可以得到盒子里的礼物,否则他什么都得不到,问最后能送出多少礼物。思路:dp[i]表示前i个人挑过礼物后,房间剩余的礼物的期望,那么每进来一个人,dp[i]=dp[i-1]-dp[i-1]/n。最后用n-dp[m]就行了。代码:#include#include#include
2014-03-16 20:19:19 690
原创 UVA 11768 Lattice Point or Not(扩展欧几里得)
题意:给出两个点,求两个点之间的线段之间的整数点的个数。思路:这题跟SGU的一个题差不多,就是利用扩展欧几里得来寻找整数点,只不过这个点是小数,刚开始想的麻烦了,搞的都快傻了、、、、细节的地方感觉不是很好写,uva太坑了,Judging Error 了一下午。代码:#include#include#include#include#include#include#includ
2014-03-16 19:00:36 943
原创 POJ 2480 Longge's problem (欧拉函数)
题意:求Σgcd(i,N)。思路:若gcd(A,N)=i,那么gcd(A/i,N/i)=1,因此,对于N的每一个因子,sum+=φ(N/i)*i。代码:#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3
2014-03-15 16:18:32 1083
原创 POJ 3696 The Luckiest number(欧拉函数)
题意:给出一个数L,现在要求一个数A,使得L|A,并且A的每一位都是8,问A的最少位数是多少。思路:代码:#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f#define Inf 0
2014-03-14 11:58:51 1260
原创 POJ 3696 The Luckiest number(欧拉函数)
题意:给出一个数L,现在要求一个数A,使得L|A,并且A的每一位都是8,问A的最少位数是多少。思路:首先要把A转化一下,把A表示成,则(p是一个整数),令,那么就存在一个整数k使得,因此,就是求。同余方程有解的条件是(10,m)=1,简单证明:若(10,m)的素因子为2 or 5,但是和10互质,因此没有2、5的素因子,即方程无解。通过欧拉公式可以知道,
2014-03-14 11:54:13 950
原创 zoj 3691 Flower(二分+最大流)
题意:给出n个点,每个点上有F[i]个花,现在要把所有的花搬到点1,每次最多能走的距离为R,但是可以再中间某个点停下,然后接着走。每个点不能停留超过L[i]次,求R的最小值使得所有的花都能搬到1。思路:比较明显的二分+网络流吧。二分R的值,然后拆点,点i向i+n连一条容量为L[i]的边。判断两两的点之间是否可达,如果可达,相应的连边,看最大流是否等于F[i]的和。代码:#include
2014-03-12 20:30:24 692
原创 zoj 3690 Choosing number(矩阵乘法+dp)
题意:有n个人,每个人从1~m选一个数,但是相邻的人如果选了一样的数,那么这个数要大于k,问所有的选法。思路:首先用dp[i][j]表示前i个人,第i个人选了第j个数字,那么dp[i][j]=sigma(j=1 to m){dp[i-1][j]} -dp[i-1][j] (jdp[i][j]=sigma(j=1 to m){dp[i-1][j]}(j>k)则前i个人总共的选法为s
2014-03-12 20:07:39 839
原创 UVA 11490 Just Another Problem
题意:S个士兵排成r行c列,其中队列中间有两个方队是空出来的,并且这两个方队大小相等,而且方队到四个方向外面的厚度都相同,求所有空出来的方队的情况。思路:在纸上画一画就可以发现S可以写成这样的形式S=6*i*i+7*i*j。这样枚举i就行了。代码:#include#include#include#include#include#include#include
2014-03-11 17:18:11 668
原创 UVA 11916 Emoogle Grid(离散对数)
这题写的略恶心,写完以后各种小bug。。。但是是一个好题~~先填满m行,m为不能涂的x的最大值。然后再填一行,然后以后每加一行就会乘(K-1)^N,转化为高次同余方程,就能解了,由于这题mod为素数,所以做起来简单很多。。。代码:#include#include#include#include#include#include#include#include#incl
2014-03-11 11:32:34 725
原创 hdu 4240 Route Redundancy(最大流)
题意:求最大流与一个流量最大的增广路的比值。思路:感觉这题过的人不多的原因绝对是题意太难理解了啊,题意明白以后就非常简单了,只需要在最大流上稍加修改就行了。我用的dinic,DFS的时候可以找到一条增广路,因此,直接在找到增广路的地方取个最大值就行了。。代码:#include#include#include#include#include#include#i
2014-03-09 19:12:12 1346 2
原创 hdu 4183 Pahom on Water(最大流)
题意:二维空间上有一些点,每个点有一个半径r和频率f,要从某一个点S走到另一个点T,然后再从T回到S。从S到T时,如果两个点表示的圆相交并且第一个点小于第二个点的频率的,那么能从第一个点到第二个点,从T到S时,第一个点的频率要大于第二个点的频率。除了S和T,每个点走后就会消失,问是否存在一种走法。思路:这题最开始看题看的晕了,其实不是很难,被我写的非常恶心。。。可以发现如果从S可以到T,那么顺
2014-03-09 17:07:34 1196
原创 poj 1320 Street Numbers(解pell方程)
题意:求满足1+2+3+……+(n-1)=(n+1)+(n+2)+……+m的前10项n和m。思路:把公式化简一下,n(n-1)/2=(m-n)(m+n+1)/2,然后可以求出2n^2=m^2+m,给m配方可以得到(2m+1)^2-8n^2=1。设x=2m+1,y=n,这样就变成了x^2-dy^2=1的形式,显然这是个pell 方程。利用迭代公式就可以求解了:Xn=Xn-1 * X1 +dY
2014-03-08 15:52:46 850
原创 FZU 1669 Right-angled Triangle(毕达哥拉斯三元组)
题意:求a,b,c,满足a^2+b^2=c^2并且a+b+c思路:本原毕达哥拉斯三元组满足: x=m^2-n^2 y=2mn z=m^2+n^2 其中x^2+y^2=z^2,m和n互素(m>n),并且n和m奇偶性不同,gcd(x,y,z)=1。知道了这些,只要枚举n和m,每次得到一个本原毕达哥拉斯三元组
2014-03-08 13:30:42 965
原创 poj 1091 跳蚤(分解质因数+容斥)
首先满足要求的解要满足gcd(a1,a2,a3……an,M)=1,也就是求n个小于等于M的数与M的最大公约数的结果为1的组合的个数。找出M的所有质因子,通过容斥原理计算组合总数,所有的组合数为M^N,现在要减去所有组合的结果与M求最大公约数不为1的个数,这样的组合数必须N个数只要含有M的一个质因子,枚举质因子的组合情况,利用容斥原理,奇数个质因子减去,偶数个质因子加上。。。就能得到结果了。还有一点
2014-03-07 20:31:10 835
原创 hdu 3338 Kakuro Extension(最大流)
这题写的好忧桑~由于不愿意读题,所以看样例yy了一下,结果写完发现每个格要填1~9,然后无语地写了个上下界的网络流,写完交上去TLE了Orz…… 由于每个格子至少都要填1,那么不妨一开始就在总量中把这个1减去,每一行(列)的容量修改为它减去它右(下)面空格的数量。这样就相当于在原来的图中填入0~8,这样问题就简单了。代码:#include#include
2014-03-07 18:32:19 793
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人