数学题也是有意思 那么总结一下
T1.【Bzoj2751】【HAOI2012】容易题
题意
有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些限制即A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,求出所有可能的数列的积的和。
题解
考虑一个式子(...)(...)(...),()内为一些数相加,根据乘法分配律,打开这个式子就是每次从每个括号中选一个元素,再把所有可能选择的结果加起来。
这件事情就是我们题目的设问,于是我们只要算出来每个位置sigma可能的选择,再乘起来就行了。
具体的实现中,因为很多位置没有限制,于是这些快速幂解决;有限制的做减法。
用到的就是小学生都知道的知识,感觉小时候玩式子玩得还是不够多啊!反应不够快!
“公式的逆”这种解题模型应该是很常见的。
T2.【Bzoj3142】【HNOI2013】数列
题意
有一个长度为m的严格递增正整数数列,规定相邻两项差值<=k,且末项<=n,并且有m(k-1)<n,求可能的数列个数。
题解
不难想到考虑数列两项的差值(设a[i]代表i项与前一项差),且因为m(k-1)<n所以差值可以随便选(不过当然不超过k)都不会选挂。
那么每一个差值序列对于答案的贡献也就是(n-sigma a[i])。
考虑暴力的方法,也就是枚举每一个a[i],然后按上面那个公式计算。
因为最后答案是由各数列累加,n的贡献可以直接来,关键是a[i],也就是我们可以分开算a[i]每个取值的贡献。
显然1~k这些数被选作a[i]概率相等,我们也知道a[i]被选总数,由此得出每个数被选次数。
我们也知道1~k的和,所以贡献就是sigma(1~k)*每个数被选次数。
具体的数值自己push吧。
T3.【Bzoj1110】【POI2007】砝码Odw
题意
n个物品,m个背包,大小都由输入给定,有一个条件n个物品任意两个有倍数关系,也可能相等,求最多能放多少物品。
题解
其实这道题和数学好像关系不大,主要是倍数关系比较神奇。
因为都存在倍数关系,那么大小物品之间是可以相互转换的。
从大到小,直接拆就可以了;从小到大,数量要够且要在一个背包中。
由此看来,从大到小比从小到大高明多了。
于是贪心,拆所有的背包,能拆成大物品就拆成大物品。比如背包19,物品8、4、2,就拆成8*2+2(拆完8后4放不进,最后的1没用)。
在此贪心,因为只要求个数,先放小的肯定比放大的好。
考虑的时候用拿个背包并不重要(这也就是拆大的高明之处),所以m个背包一起考虑(就是把每个物品在各个背包的系数加起来)。
如果当前物品系数不够,考虑上面的分析过程,把大的拆成小的就可以了。
因为是倍数,且大小在10^9内,就算每次*2,也只可能有30不同物品,于是怎么实现都可以了。
以上是我口胡的方法,比较正规的说法是,把背包看做一个奇怪的进制(倍数关系),然后拆大就是借位。
接下来两道题Orz叉姐
如此神奇的模型转换我怎么想得到呢
于是直接copy题解供大家欣赏好了
T4.【POJ 3244】Difference between Triplets
题意
定义两个三元组I(xi,yi,zi)和J(xj,yj,zj) (可以看做是空间中的点)
他们的距离为D(I,J)=max{xi-xj,yi-yj,zi-zj}-min{xi-xj,yi-yj,zi-zj}
给定n个三元组(n<=200000),求任意两个三元组的差的和
题解
抽化出来的模型是 max(a,b,c)-min(a,b,c),这个东西吧他放在数轴上 a,b,c
我们要求最大和最小的差就是这三个点构成的线段的距离,那么我们这里再变通下 是不是端点到中间那个点的距离
其实画出这个图的时候,就可以看到这个距离为(|a-b|+|b-c|+|c-a|)/2,这样我们并不需要关心中间的那个//也就是线段的长度
对应到题目中的原型,就是(|(xi-xj)-(yi-yj)|+|(yi-yj)-(zi-zj)|+|(zi-zj)-(xi-xj)|)/2;
对应到同一个点上就是(|(xi-yi)-(xj-yj)|+|(yi-zi)-(yj-zj)|+|(zi-xi)-(zj-xj)|)/2;
设a=(xi-yi),b=(yi-zi),c=(zi-xi),原问题等价为(|ai-aj|+|bi-bj|+|ci-cj|)/2;
然后三个可以完全分开完全独立的计算,并不影响其他两元,这里要加个优化,就是按从小到大排序出来
我们只需要算出每个位置上,他贡献了多少次加法,贡献了多少次减法即可
举个例子,目前把a的部分排序了,对于第i个,他前面的比它小,所以在和i点比较时i点贡献了i次加法,对后面的n-i个点向他们做了n-i次减法
T5.【POJ 2595】Min-Max
题意
设函数F(x1,x2...xn)=Σuixi(1<=i<=n),u为函数固定的系数,且对u有限制Σu=1且u∈[0,1],但是你不知道,你只知道一组输入x1,x2...xn对应的输出为C,问题是给定的另一组输入y1,y2...yn的输出最小与最大可能是多少。
题解
观察一下u的神奇范围我们可以很直观的联想到一群质点的重心公式,不妨将(xi,yi)作为坐标放在平面直角坐标系中,我们就可以将所有的有序实数对看成质量相等的质点,C就是其重心的x坐标,答案即为重心的y坐标,由重心知识可知重心位于点集的凸包内部,所以贪心得到答案为凸包边(点)上,所以求出凸包维护一下答案就行了。