![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数学
Baoli1008
233
展开
-
hdu 4810 Wall Painting(组合数学)
首先把所有数都转换成二进制,然后原创 2014-11-07 21:49:56 · 474 阅读 · 0 评论 -
UVa 11645 Bits(计数原理+高精度)
枚举任意相邻两位都是1的次数,这个次数是这两位前面的数的方案数乘上后面的数的方案数,如果这两位最大值都是1,那么还要多加上一个后面数的方案数。答案会爆long long,要用高精度。代码://// main.cpp// 11645 Bits//// Created by Baoli1100 on 15/2/15.// Copyright (c) 2015年 Bao原创 2015-02-28 16:31:32 · 591 阅读 · 0 评论 -
UVa 12293 Box Game(博弈,SG函数)
用当前人可以分配的球数就可以代表一个状态,开始Alice拿掉那个1个球的箱子后,剩下n个球由他来分配,分配为一多一少后,Bob所分配的球数是多的箱子中的数量。即,球数n可以转化为(n+1)/2~n-1间的一个数。用这个规律递推SG值。SG(n)=除所有n能到达的状态的SG值以外,最小的非负整数。必败状态SG值为0,显然1是一个必败状态。SG值用记忆化搜索求出。对前1000个数测试后发现SG原创 2015-03-10 10:46:45 · 646 阅读 · 0 评论 -
UVa 11892 ENimEn(博弈推理)
把所有数分为是1的和不是1的,当把所有不是1的数取完后,显然如果1的数量为奇数则先取的赢,否则后取的赢。因此先手有如下必胜策略:若1的数量为奇数:依次把每个不是1的数取成1,这样对手只能把这堆取完,这样两人合作把所有不是1的数取完,先手胜。若1的数量为偶数:同上,强迫对手与自己合作取完不是1的数直到最后一个不是1的数,先手直接取完这个数,这样后手先取是1的那些数,先手胜。因此,原创 2015-03-10 12:31:51 · 893 阅读 · 0 评论 -
POJ 1023 The Fun Number System (递推)
给定一个数,在正常的二进制中它的表示是唯一的。而在这道题中,由许多种表示方法。比如1,可以是1,可以是2+(-1),可以是4+(-2)+(-1),但是有一点是确定的,如果要构造这个1,要么选1,要么选-1和后面的数组合,不可以不选。所以由低到高枚举N的每个二进制位,如果这一位上是1,那么不管字符串中这一位是正的还是负的都必须选,如果是负的,那么后面就要多凑出1把这个-1对掉,所以N要+1原创 2015-04-01 11:23:22 · 669 阅读 · 0 评论 -
扩展欧几里德定理
转自:点击打开链接扩展欧几里德算法是用来在已知a, b求解一组p,q使得p * a+q * b = Gcd(p, q) (解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。下面是一个使用C++的实现: int exGcd(int a, int b, int &x, int &y) { if(b == 0) { x = 1;转载 2015-04-06 15:58:57 · 951 阅读 · 0 评论 -
HDU 1724 Ellipse (自适应辛普森公式)
自适应simpson裸题自适应辛普森:simpson公式这样估计一段积分的值:对于F函数,a到b这一段的积分近似等于S(period)=(F(a)+F(b)+4*F(mid))/6*(b-a),即认为近似为一个常数积分,常数等于(F(a)+F(b)+4*F(mid))/6,其中mid=(b-a)/2。如果F函数波动剧烈,这个估计方法会很不准。所以自适应辛普森会自动在波动原创 2015-07-14 11:03:33 · 1356 阅读 · 0 评论 -
Lucas定理 大组合数取模
转自AC_Vonhttp://www.cnblogs.com/vongang/archive/2012/12/02/2798138.html组合数取模 Lucas定理对于C(n, m) mod p。这里的n,m,p(p为素数)都很大的情况。就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了。这里用到转载 2015-08-10 13:36:25 · 504 阅读 · 0 评论 -
第一,二类斯特林数
转自:点击打开链接 第一类Stirling数 s(p,k) s(p,k)的一个的组合学解释是:将p个物体排成k个非空循环排列的方法数。 s(p,k)的递推公式: s(p,k)=(p-1)*s(p-1,k)+s(p-1,k-1) ,1边界条件:s(p,0)=0s(p,p)=1 递推关系的说明:考虑第p个物品,转载 2015-08-12 15:30:56 · 617 阅读 · 0 评论 -
Codeforces 547 Div1 A. Mike and Frog(找循环节)
因为m最大只有10^6,模m的余数只有m种,所以暴力模拟m次可以保证所有可能出现的余数都出现了,如果有没出现的,说明之前出现了循环,循环节最大是m,所以总共需要模拟2*m次保证如果有循环节的话可以找到这个循环节。对于h1有3种情况,到不了a1,只到达一次a1,到达两次a1且循环节为n1。 h2同理如果h1,h2都没到达过答案显然-1如果h1,h2都有循环节,那么任意枚举原创 2015-08-03 20:18:58 · 579 阅读 · 0 评论 -
康托展开和逆展开
康托展开:对于1~n的所有排列,要确定某个排列是字典序中第几个排列,可用康托展开。这个技巧在做对排列的hash时十分有用,因为不需要使用set来记录那些大于int最大值的数字了。原理十分简单,对于4 5 1 3 2 这个排列来说,第一位是4,大于(1,2,3)3个数,以这三个数开头的排列共有3*4!个,它们都小于原排列;再看第二位5,在这一位上有4个数小于5,但是由于现在考虑的情况是第二位原创 2015-08-29 09:43:35 · 486 阅读 · 0 评论 -
Codeforces 558C - Amr and Chemistry (枚举)
枚举每个数乘二和除二过程中所能到达的所有数,并记录到达时的步数,最后统计在所有数都能到达的数字中步数和最小的数字。因为只有*2和/2的操作,所以往大往小都是log级的。注意,如果一个数是奇数,那么它本身一直乘二所能到达的数字,和它除2向下取整再一直乘二所能到达的数字是完全不相同的。因为在二进制下除二后相当于左移把末尾的1弄没了,以后再右移时前缀都不一样了。所以在向下除的过程中每次遇到奇数都原创 2015-07-24 12:21:12 · 874 阅读 · 0 评论 -
Codeforces 546D. Soldier and Number Game(找所有数质因子数量)
对于给定的数只要保证每次除的是它的质因子就可以使除的次数最多。问题就转化为求b+1到a中所有数的质因子总和。求所有数的质因数数量,可以在筛法求素数对于因子i枚举i的倍数j时,对j一直除i直到不能整除,除了几次就说明j中有几个质因子i,把这些统计起来,具体看代码。因为询问很多,要做一个前缀和的结构。代码:#include #include #include #i原创 2015-08-19 12:51:35 · 641 阅读 · 0 评论 -
UVa 11481 Arrange the Number(容斥原理)
从M中选定K个不变的数是C[M][K]种方案,对于每种方案容斥,在剩下的N-K个数中不能有不变的,那么就要减掉有一个不变的,加上有两个不变的,减去3个不变的。。。以此类推。代码://// main.cpp// 11481 Arrange the Number//// Created by Baoli1100 on 15/2/28.// Copyright (c)原创 2015-02-28 19:32:21 · 593 阅读 · 0 评论 -
UVa 11038 How Many 0's?(数学计数)
问题转化为求0到x的所有数中0的数量,相当于前缀和。求前缀和的方法:依次求每一位上是0的情况数,这是要分这一位上原数是不是零这两种情况讨论的。求的过程中需要当前处理这一位的左边,右边数各是多少。一个方便的方法是只用两个数维护,从右往左递推修改这两个数。代码:#include #include #include using namespace std;#define原创 2015-02-08 13:03:07 · 528 阅读 · 0 评论 -
hdu 4465 Candy(log压缩大数)
期望公式很好推,要注意空洞原创 2014-11-11 20:43:25 · 649 阅读 · 0 评论 -
Codeforces 424C Magic Formulas(异或应用)
本题使用了异或的两个性质,交换律,自己是自己的逆元。把公式用交换律改变顺序,把mod值相同的数放在一组,这样这些值在组内是循环的,算出循环的组数是奇数还是偶数,是偶数就不用算了。再把尾巴异或上。还有要注意循环是从1开始的。mod对异或没有分配律,即(a%mod)^( b%mod) != (a^b)%modmod 对加,减,乘有分配率,对除没有分配率代码:原创 2015-01-31 15:57:41 · 697 阅读 · 0 评论 -
UVa 11401 Triangle Counting(数学递推)
设x为最长边的方案数是c(x)。三边满足x-y注意:使用for循环递推时,循环变量i如果参与运算,一定要注意是不是会爆int,那样就要开成long long!代码:#include #include #include using namespace std;#include #define LL long longLL a[1000005];int N原创 2015-01-31 09:59:46 · 456 阅读 · 0 评论 -
UVa 10943 How do you add?(数学递推)
相当于求解方程x1+x2+......+xk=N。把这个方程转化为(x1+1)+(x2+1)+......+(xk+1)=N+K,这样每一项都是大于等于1的。那就相当于把N+K个1排成一行,分隔成K个部分,也就是在N+K-1条分隔线中选K-1条,C[N+K-1][K-1]就是答案。代码:#include #include #include using namespace原创 2015-02-03 10:42:00 · 494 阅读 · 0 评论 -
UVa 11021 Tribbles(概率递推)
用dp[i]表示:初始1只麻球在第i天后后代全部死亡的概率。那么dp[i]就可以由dp[i-1]递推而来。最终结果就是dp[m]^k。概率问题要想办法把问题化简,原创 2015-02-02 12:40:27 · 482 阅读 · 0 评论 -
UVa 10892 LCM Cardinality (分解质因数+数学)
本题挺经典的,sqrt(n)时间复杂度分解质因数。先看一个公式,数字a=p1^a1*p2^a2*p3^a3.........,b=p1^b1*p2^b2*p3^b3(其中pi为质因数,ai,bi为幂次),那么他们的LCM c=p1^max(a1,b1)*p2^max(a2,b2)..........,同理gcd是取每个质因数幂次最小值。这样,如果lcm:c确定了,且c=p1^c1*原创 2015-02-04 15:04:33 · 1187 阅读 · 0 评论 -
UVa 19780 Again Prime?No time. (质因数分解)
先把m分解成质因数,记录下m的每个质因数在m中的个数。然后遍历1至n的每个数,对m的每个质因数分别判断包含多少个,并对这些数累加。单独考虑每个质因数,质因数在1到n中的数量/在m中的数量,是理论上m考虑这个质因数的最大值。那么遍历所有质因数,这个值的最小值就是答案。代码:#include #include #include using namespace std;#in原创 2015-02-03 11:44:44 · 653 阅读 · 0 评论 -
UVa 11752 The Super Powers(数学)
设一个数为x=a^k,如果k是合数,k=m*n,那么x=(a^m)^n=(a^n)^m,这样这个数就是超级幂了。首先1是答案,然后底数从2开始循环,指数最多是64,所以先扫一遍64以下的合数。底数的范围是65536,因为2以上的合数最小是4,65536^4已经超过最大值了。这样一个二重循环,把2到65536的每个数的合数次幂都加到答案里。显然这些答案是有重复的,去重两种方法:1.头文件原创 2015-02-04 20:58:34 · 743 阅读 · 0 评论 -
UVa 11609 Teams(快速幂+数学)
选择i个人的方案数是C(n,i)*i,选择n-i个人的方案数是C(n,n-i)*(n-i),这两项相加就是C(n,i)*n。所以所有项做和就是(C(n,0)+C(n,1)+....+C(n,n))*n/2=2^(n-1)*n.计算2的n-1次方需要快速幂代码:#include #include #include #include using namespace st原创 2015-02-04 21:44:06 · 496 阅读 · 0 评论 -
UVa 11076 Add Again(数学)
假设数字k在第一位,求出剩下N-1位的排列数m,就是在这一位上k出现的次数,在每一位上k出现的次数都是m,所以数字k的贡献就是1111.....×k×m代码:#include #include #include using namespace std;#include #define LL long longint N;int a[14];int cur[10];原创 2015-02-04 19:05:14 · 541 阅读 · 0 评论 -
UVa 10791 Minimum Sum LCM(分解质因数)
假设输入N=p1^a1*p2^p2*....*pn^an,那么能得到它的数中对于质数pi至少有一个数含有因子pi^ai,对质因数pi,pj而言,满足这两个数有两种方法,要么这两个因子在一个数中,要么分别在两个数中。显然在两个数中比在一个数中更优。因为可以证明当m,n都大于等于2时,m*n>=m+n。因此最优的方案就是每个pi^ai单独当成一个数相加。这样就变成了一个分解质因数的原创 2015-02-05 10:58:14 · 936 阅读 · 0 评论 -
UVa 10883 Supermean(log压缩)
展开后每个数被加的次数刚好是二项式展开式系数。但是因为N太大,直接算组合数肯定会爆。所以把它们全取log存储,把所有数都要除的2^(n-1)也取log,相减,最后再用exp函数还原。代码:#include #include #include #include using namespace std;double a[50005];double c[50005];int原创 2015-02-08 17:54:58 · 537 阅读 · 0 评论 -
矩阵模板
struct Matrix{ int mat[15][15]; int n; void init(int _n){ n = _n; memset(mat,0,sizeof(mat)); } Matrix operator *(const Matrix &b)const{ Matrix ret;转载 2015-09-11 20:24:54 · 525 阅读 · 0 评论