上一页 1 2 3 4 5 6 7 ··· 85 下一页
  2012年10月31日
摘要: POJ_2891 两个同余方程是可以合并成一个同余方程的,就这样一直合并直到没法合并为止,注意运算过程中要合理地使用模操作来避免中间结果超出long long。#include<stdio.h>#include<string.h>#include<algorithm>typedef long long LL;int K;void exgcd(LL a, LL b, LL &d, LL &x, LL &y){ if(b == 0) d = a, x = 1, y = 0; else exgcd(b, a % b, d, y, x), y 阅读全文
posted @ 2012-10-31 15:31 Staginner 阅读(368) 评论(0) 推荐(0) 编辑
  2012年10月30日
摘要: BZOJ_1777 说实话,下面的分析我也不知道究竟对不对,基本都是凭感觉来的,不过可以AC这个题。 首先这是个组合游戏,尝试从sg理论入手解决这个问题。感觉各个节点上的石子应该是相互独立的,这样我们只要依次计算出每个节点上有当期这些石子时sg值是多少,最后再将各个sg值异或起来就是整个局面的sg值。如果独立去计算每个节点的话,那么显然节点的位置是没有太大关系的,只和当前这个节点和根节点的距离有关。我们从离根结点最近的点开始依次向外递推,尝试去计算各个节点上有若干石头时的sg值,这时我们会发现,如果当前这个节点距离根节点的距离为奇数的话,那么这个节点石头数为0,1,2...时对应的sg值为0, 阅读全文
posted @ 2012-10-30 22:14 Staginner 阅读(438) 评论(0) 推荐(0) 编辑
  2012年10月29日
摘要: UVA_11426 假设a、b(a<b)互质,那么gcd(a,b)=1,这样当i循环到a、j循环到b时就会向结果中+1,而i循环到2*a、j循环到2*b时就会向结果中+2(gcd(2*a,2*b)=2)...循环到k*a和k*b时就会向结果中+k。这样实际上引起结果变化的根源就在于各对互质的数,当i、j循环到他们自身或者自身的倍数时就会引起结果的改变,那么我们不妨先将每对互质的数对结果的贡献值算出来,最后将各对互质的数对结果的贡献累加起来就可以了。 假设和b互质的数有n个,也就是n对(?,b)(?和b互质),那么在i、j循环到?、b时结果会增加n,循环到(2*?,2*b)时结果就会增加2 阅读全文
posted @ 2012-10-29 17:40 Staginner 阅读(1711) 评论(0) 推荐(1) 编辑
  2012年10月28日
摘要: UVA_11361 首先,因为各个数位上的数字之和是不会大于100(我没有精确计算)的,那么K给这么大其实是唬人的,就当成K是小于100即可,大于等于100的情况可以直接输出0。 我们不妨先计算出小于等于B中有多少是满足要求的,再计算出小于等于A-1中有多少满足要求的,两者做差即可。比如现在计算小于等于B中有多少是满足要求的,在计算的时候可以用f[i][j][k]表示递推到了左起第i位时,数位上数字和模K为j,数本身模K为k的数中小于B的数一共有多少个,接下来如果采用刷表法的话,会有两部分需要考虑,一部分是当前本来就比B小,那么第i+1位是什么都无所谓,直接将f[i][j][k]累加到对应的f 阅读全文
posted @ 2012-10-28 17:25 Staginner 阅读(1153) 评论(1) 推荐(0) 编辑
摘要: UVA_11806 这个题目直接计算不大好算,但是反过来去计算不符合要求的局面则容易很多。 我们不妨设A[i]表示我们规定其中i条边上不能放,而其他的地方随便放,所得的一个结果(比如i=2,我们要枚举是哪2条边没有放,然后其他地方随便放,可以用组合数求得结果,最后将每次枚举所得的结果加起来作为A[2]的值)。再设a[i]表示有且仅有i条边上没有放的情况数(比如i=2,同样是枚举哪2条边没有放,最后C(4,2)种枚举所得的情况之和才是a[2]的值)。 我们想要的显然是a[1]+a[2]+a[3]+a[4],这就是所有不符合要求的情况,但是同样不好直接计算,但是A[i]却很好计算,我们只要枚举哪些 阅读全文
posted @ 2012-10-28 10:43 Staginner 阅读(484) 评论(0) 推荐(0) 编辑
摘要: UVA_12508 这个题目的一个坎就是要想到去枚举三角形的外接矩形,如果想到这一点的话剩下的思路就不难想了,分情况计算出各种三角形(当然这些三角形的外接矩形必须是枚举的这个矩形)的数量然后再乘以大矩形中有多少个这样的外接矩形,这样一种外接矩形的情况就算是算完了。所有外接矩形的情况累加起来就是最终的结果了。#include<stdio.h>#include<string.h>#include<algorithm>typedef long long LL;int N, M, A, B;LL deal(int limit){ LL ans = 0; for(in 阅读全文
posted @ 2012-10-28 01:02 Staginner 阅读(513) 评论(4) 推荐(0) 编辑
摘要: BZOJ_1776 本来以为是个树的分治的题目,结果balabala敲完之后跑了8s多,大概是N*logN*logN的复杂度……比较好的办法还是转化成LCA问题,具体思路可以参考这篇博客:http://hi.baidu.com/edward_mj/item/2b46d4330c23edc61b9696c2。#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>#define MAXD 200010#define MAXM 400010#define INF 0x 阅读全文
posted @ 2012-10-28 00:47 Staginner 阅读(235) 评论(0) 推荐(0) 编辑
  2012年10月27日
摘要: UVA_11538 可以将两个皇后的位置分为横、竖、斜三种情况去计算,每种都可以总结出O(1)的计算公式。#include<stdio.h>#include<string.h>#include<algorithm>typedef long long LL;int N, M;LL sum(int n){ return (LL) n * (n + 1) / 2;}LL sum2(int n){ return (LL)n * (n + 1) * (2 * n + 1) / 6;}int main(){ while(scanf("%d%d", & 阅读全文
posted @ 2012-10-27 19:59 Staginner 阅读(235) 评论(0) 推荐(0) 编辑
摘要: UVA_11401 如果单纯统计合法的三角形,好像不大好办。但如果去统计不合法的,还算好办一些,因为不合法的三角形就相当于找到任意两条边a、b,并且另外一条边c要满足c>=a+b,那么以a、b为边的不合法的三角形一共就有N-(a+b)+1种(这里假设a+b<=N),当然我们不能直接枚举a、b去计算。但观察到实际上a+b的范围是有限的,3到2*N-1而已,那么不妨考虑如果和为i的时候一共有多少对不同的a、b呢?比较容易发现是有(i-1)/2对的,那么最后不合法的三角形数量就变成了sum{(i-1)/2*(N-i+1)}(3<=i<=N)。但是由于数据的原因,O(N)的办法 阅读全文
posted @ 2012-10-27 19:26 Staginner 阅读(277) 评论(0) 推荐(0) 编辑
  2012年10月26日
摘要: HDU_4441 1. insert 至于找最小的没出现过的正整数,维护一个线段树就很容易实现了。插入+i的时候和普通的splay的插入操作没什么区别,插入-i的时候还涉及到统计的问题。说是让-i越靠右越好,其实也就是不得不让i出栈的时候再让它出栈,那么-i的右边应当也是一个负数(或者-i是最后一个数)。假设插入+i的左边有n个正数,那么-i就应该放在第n+1个负数的左边,如果不存在第n+1个负数,那么就放在序列的最右边。这样就涉及到统计一个区间内有多少正数、负数,以及去查找第k个负数等操作,这一点可以通过给splay维护区间内的正数、负数的数量来实现,也就是多打两个标记就行了。 2. rem 阅读全文
posted @ 2012-10-26 23:59 Staginner 阅读(1318) 评论(6) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 85 下一页