The Sun Also Rises

Algorithm, Mathematica, 计算机科学, C++, photography, GNU/Linux的讨论空间

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  73 随笔 :: 6 文章 :: 169 评论 :: 0 Trackbacks
Northwestern Europe 2005 Unequalled Consumption
求最小的q, 使方程a1*x1+a2*x2+...+an*xn=q的整数解大于给定的数。
n<=5, ai <= 10,q <= 10^15
设该方程的解数是f(q),则f(q)未必单调,但对确定的q0, f(q0+t*a1)必然关于t单调(因为t小的时候的所有的解都可以平行移动到大的t的解)
然后枚举下q0(反正才10个),二分。
问题的关键就是求f(q)

利用母函数,f(q)就是母函数
P(x) = (1 + x^a1 + x^(2*a1) + x^(3*a1) +...)(1 + x^a2 + x^(2*a2) + ...)...(1 + x^an + x^(2*an) + ...)
的x^q项系数。
令LCM为a1, a2...an的最小公倍数。
则P(x) =
(1 + x^a1 + x^(2*a1) + ... + x^(LCM - a1)) * (1 + x^LCM + x^(2 * LCM) + ...)*
(1 + x^a2 + x^(2*a2) + ... + x^(LCM - a2)) * (1 + x^LCM + x^(2 * LCM) + ...)*
*...*
(1 + x^an + x^(2*an) + ... + x^(LCM - an)) * (1 + x^LCM + x^(2 * LCM) + ...)
=
(1 + x^a1 + x^(2*a1) + ... + x^(LCM - a1)) * (1 + x^a2 + x^(2*a2) + ... + x^(LCM - a2)) * ... *(1 + x^an + x^(2*an) + ... + x^(LCM - an)) *
(1 + x^LCM + x^(2 * LCM) + ...)^n

注意前一部分的x^r系数可以算出来(例如用DP)
后一项中x^(LCM * k)的系数是C(n+k-1, n-1) (推一下就知道了)

然后就可以得出结果了是吧~~~
p.s. 利用推出的结论可以知道对于给定的r, f(q + LCM * t)是一个关于t的n次函数。。。所以其实可以算出所有小于n * LCM的f(q)值然后使用Langrage插值公式,这个是标程的做法。
(其实我想知道有没有更简单的方法证明这是一个关于t的n次函数~)



SPOJ 598, INCR
求n的排列中,最长上升序列为b的排列个数。
n<=40, b <= 5
做法是dp, 状态记录n的排列中len = 2的上升序列最后元素的最早位置,len = 3的上升序列最后元素的最早位置...
每次转移的时候枚举n + 1的放置位置,并计算新的状态。
由于有效状态的稀疏性,可以用map / hash来优化。。。
CODE



Dhaka 2007 The Dumb Grocer
题意懒得说了~
首先要有1是吧。。。然后我们按照1的个数来分类,我们来计算恰有k个1的方案数。
我们在k个1的基础上加入新的数,显然第一个数只能是k+1
然后加入的数只能是k + 1 or 2 * (k + 1)
如法炮制。。。发现非1的数都具有(k + 1) * t的形式。。。设其依次为(k + 1) * ti
则{ti}这些数也满足题目的性质。。。共有f((n - k) / (k + 1))种方案。

设f(n)是要求的函数,则f(n) = sigma(f((n - k) / (k + 1)), (k + 1) | (n + 1) , k>=1
f(0) = 1
这样直接做会T...
我们令g(n) = f(n - 1)
则g(n) = f(n - 1) = sigma(f((n - k - 1) / (k + 1))) = sigma(f(n / (k + 1) - 1)) = sigma(g(n / (k + 1)), (k + 1) | n, k >= 1
设n = p1^a1 * p2^a2 * ... * pr*ar
令h(p1, p2,.., pr, a1, a2...ar) = g(n)
= h(p1,p2, ...pr, b1, b2, ...br),
0<=bi <= ai, bi不全=ai
注意对于一个确定的n,h()中的p1, p2...pr在计算过程中始终不变。。。所以。。。计算结果与pi无关,只与ai有关
这样状态数就大大减少了。。。直接因式分解后dp就行了。。。
CODE




Dhaka 2007 You are around me ...
首先旋转坐标,变成平行与xy轴的椭圆,然后坐标伸缩。。。变成圆。。。最近点对。。。贴模板。。。
ZJU2107 Quoit Design 一道测最近点对的题。




Dhaka 2007 Magnetic Train Tracks
给定n个点,求可以构成多少个锐角三角形。
n <= 1200
话说求锐角三角形不太好算是吧。。。补集转换,我们来求钝角/直角三角形 <=> 求钝角/直角个数。。。
后面的事情就简单了,是对每个点,将其他点按照极角排序 + 扫描。
Dhaka 2005 Counting Triangles 也是一道补集转换的题~(转化成求三点共线的个数)
Shanghai 2004 Amphiphilic Carbon Molecules 也是一道极角排序+扫描的题。
posted on 2008-01-24 15:13 FreePeter 阅读(638) 评论(0)  编辑 收藏 引用 所属分类: ACM/ICPC

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


Creative Commons License
This site is licensed under a Creative Commons Attribution-Share Alike 2.5 China Mainland License. 本站采用创作共用版权协议, 要求署名、相同方式共享. 转载本站内容必须也遵循“署名-相同方式共享”的创作共用协议. This site is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.