上一页 1 2 3 4 5 6 7 8 ··· 15 下一页
摘要: N个楼高度1~N,在最前面可以看到F栋楼,最后面可以看到B栋楼,求有多少种可能的排列。 对某几个数组成的集合,可以定义一个最大表示法,就是最大的数在最前面。F+B栋楼,去掉N之后,就是F+B-2个集合,选中其中的B-1个在前方按集合最大值升序排列,后方反之。然后对每个集合,不管怎样排列,看到的都是最大的那一个,可以想到是第一类stirling数,用N-1个数组成F+B-2个圈的排列数。 所以答案就是C(F+B-2,F-1)*S(N-1,F+B-2)。O(N^2)预处理,O(1)查询。 1 #include <string.h> 2 #include <stdio.h> 阅读全文
posted @ 2012-10-10 10:06 Burn_E 阅读(176) 评论(0) 推荐(0)
摘要: 有K个数D1~DK,一开始S0=0,每个人可以报一个数Si+1=Si-1+Dj或者Si+1=Si-Dj(1<=j<K),并且满足Si<=N及Si>Si-2,最先不能报数者输。 如果自己在某回合报的不是最小数,那么对方就可以减掉最小数使S变小,因为要满足条件自己又要加上一个比最小数大的数,对方又可以减掉最小数。。。这样每次使数变大的都是自己,必输。 所以最优策略就是一直报最小数。 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #define INF 0x3 阅读全文
posted @ 2012-10-10 09:58 Burn_E 阅读(230) 评论(0) 推荐(0)
摘要: 给出两个N*N的矩阵C和X,其中X是一个01矩阵,并满足以下几条,求最小的∑Cij*Xij(1<=i,j<=n)。 1.X12+X13+...X1n=1 2.X1n+X2n+...Xn-1n=1 3.for each i (1<i<n), satisfies ∑Xki (1<=k<=n)=∑Xij (1<=j<=n). 如果将C看作邻接矩阵,Xij=1实际上就是选择C中的对应边。那选出的这些点和边有什么特点呢,根据C的条件可以看出,顶点1的出度为1,顶点N的入度为1,其它点的入度=出度。这实际上就构成了一条从1到N的路径,或者从1出发走过一个环回 阅读全文
posted @ 2012-10-10 09:52 Burn_E 阅读(305) 评论(0) 推荐(0)
摘要: 求C(n+m,m)%p ,n和m很大,p是小于10^5的素数。 LUCAS定理。 1 #include <string.h> 2 #include <stdio.h> 3 typedef long long LL; 4 int cas; 5 LL n, m, p; 6 LL fac[100005]; 7 LL powmod(LL a, LL b, LL p){ 8 LL ans = 1, tmp = a; 9 for (; b; b >>= 1, tmp = tmp * tmp % p)10 if (b&1) ans = ans * tmp % p; 阅读全文
posted @ 2012-10-09 14:03 Burn_E 阅读(258) 评论(0) 推荐(0)
摘要: 跟2010福州的现场赛那题基本一样的,只是多了个去重。。上半年在金华邀请赛的时候还不会AC自动机,今天突然想起来就找出来写了一下。。数据给的很大,不过空间给的也是巨大=。= 解码后就是裸的自动机,把包含的串标记一下,再用自动机找这些串的子串去重即可。 1 #include <string.h> 2 #include <stdio.h> 3 #define MAXN 3000000 4 int cas, n; 5 int pos, next[MAXN][26], fail[MAXN], id[MAXN], flag[MAXN]; 6 char s[MAXN*2], ss[ 阅读全文
posted @ 2012-10-04 21:44 Burn_E 阅读(456) 评论(0) 推荐(0)
摘要: 求区间内该数的值模该数的各位数字和为0的数有多少个。 没想到简洁的状态,d[i][s][mod][r]表示i位,前缀和为s,总和为mod,%mod=r的数有多少个。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 //i位,前缀和为s,总和为mod,%mod=r的数有多少个 5 int num[10], len, ans, sum, d[10][82][82][82]; 6 int dfs(int i, int s, int mod, int r, bool e){ 7 阅读全文
posted @ 2012-10-04 16:26 Burn_E 阅读(362) 评论(0) 推荐(0)
摘要: 一堆N个石头,每人每回合可以将其分成K和N^K两堆,并且满足K<N且N^K<N,最后不能移动的人失败。 用F(N)代表N里面1的个数,容易推出F(N)和F(K)+F(N^K)的奇偶性相同。最后的终态是F(X)=1,即最后的堆数只和1的个数有关。所以如果F(N)=奇数,一定经过偶数次操作到达终态,如果F(N)是偶数,一定经过奇数次操作到达终态。 所以只要看1的个数为奇数的堆有多少个就知道输赢了。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 using nam 阅读全文
posted @ 2012-10-04 16:20 Burn_E 阅读(300) 评论(0) 推荐(0)
摘要: 长度为N的格子,Alice和Bob各占了最左边以及最右边K个格子,每回合每人可以选择一个棋子往对面最近的一个空格移动。最先不能移动的人获得胜利。 官方题解: k=1时 很容易看出,n为奇数则后手获胜,n为偶数则先手获胜 k>1时 如果n=2*k+1,则棋 盘中只有一个空白的格子,每次移动必须移动到当前的空白格子上。先手方可以先随意选择一颗棋子占据中间的位置,然后双方互有移动,移动过程中双方肯定都会 选择一颗在己方半场的棋子移动到对方半场里。直到后手方还剩下一颗己方半场的棋子时,先手方把占据中间的棋子移动到对方半场,此时后手方必须移动剩下的这 颗棋子到空出的中间的格子里,先手方再把... 阅读全文
posted @ 2012-10-04 15:48 Burn_E 阅读(282) 评论(0) 推荐(0)
摘要: 之前无聊时还想到过这个东西,没想到多校就出出来了。。 结论是面积最大时正好是圆的内接四边形,证明网上可以找到。。 1 #include <stdio.h> 2 #include <math.h> 3 #include <algorithm> 4 double l[4]; 5 int cas; 6 double hl(){ 7 double p=(l[0]+l[1]+l[2]+l[3]) / 2; 8 return sqrt((p-l[0])*(p-l[1])*(p-l[2])*(p-l[3])); 9 }10 int main(){11 scanf(&quo 阅读全文
posted @ 2012-10-04 08:55 Burn_E 阅读(224) 评论(0) 推荐(0)
摘要: 有N个点,每次可以从起点出发到1或者2个点然后回到起点,问走过所有的点需要的最小路程(路程定义为欧氏距离的平方)。 显然,到一个点路径为S->i->S,到两个点走过的路径为S->i->j->S。状态压缩然后枚举即可。因为和顺序无关,每次只要枚举最小的没有走的点,然后枚举到这个点返回或者到这个点再去另一个点之后返回的路径长度,相同的状态取最小值即可。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 #define INF 0x3f3f3f3f 阅读全文
posted @ 2012-10-04 08:51 Burn_E 阅读(219) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 7 8 ··· 15 下一页