摘要: 二分水题,A,B,C三个数组排序,对于每个B[i],二分算出来有多少A比他小,多少C比他大,然后扫一遍出结果。O(nlog(n))水过。 include using namespace std; const int MAXN = 1e5+10; int A[MAXN],B[MAXN],C[MAXN] 阅读全文
posted @ 2017-11-05 13:03 追梦的蚂蚁 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 先说最暴力的算法,直接对一万内的每个数字暴力分解因子(对每个数字的时间复杂度是O(sqrt(n)的),然后,用个数组记录下来因子和,然后寻找 亲密数。 好一点:要先打个素数表,然后对每个数字,分解素因子, 假设因子和函数为 ,则 , 推导后: 证明过程见《初等数论及其应用》(原书第六版)184 18 阅读全文
posted @ 2017-11-03 20:27 追梦的蚂蚁 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 基础的动态规划。。。数塔取数问题。 状态转移方程: dp[i][j] = num[i][j] + max(dp[i+1][j],dp[i+1][j+1]); 阅读全文
posted @ 2017-11-02 20:51 追梦的蚂蚁 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 直接python搞过。没啥好办法。看了下别人做的,多数也是大数乘法搞过。 如果用大数做的话,c++写的话,fft优化大数乘法,然后快速幂一下就好了。 阅读全文
posted @ 2017-11-01 18:59 追梦的蚂蚁 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 组合数,2n中选n个。向右走有n步,向下走有n步。共2n步。有n步是向右走的,计算向右走的这n步的所有情况,即C(2n,n)。 或者,每一步,只能从右边或者上边走过来,只有这两种情况,即step[i][j] = step[i 1][j]+step[i][j 1],递推即可。 include usin 阅读全文
posted @ 2017-11-01 18:51 追梦的蚂蚁 阅读(103) 评论(0) 推荐(0) 编辑
摘要: 记忆化搜索来一发。没想到中间会爆int 阅读全文
posted @ 2017-10-30 16:16 追梦的蚂蚁 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 最直接的想法就是暴力搞搞,直接枚举,暴力分解因子。再好一点,就打个素数表来分解因子。假设num=p1^a1 p2^a2 ... pn^an,则所有因子个数为(a1+1) (a2+1) ... (an+1)。 再好一点呢,还是要利用积性函数。假设因子个数函数为f(x),因为num=n (n+1)/2, 阅读全文
posted @ 2017-10-28 12:07 追梦的蚂蚁 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 除非人品好,能碰巧想到思路,否则基本是做不出来dp的,除了那几个经典的dp模型。。 看了几个前几名的代码,还是t神的代码比较清晰。膜tourist 代码的思路和题解思路基本一致。。。。。 include using namespace std; const int MAXN = 1234567; c 阅读全文
posted @ 2017-10-16 17:15 追梦的蚂蚁 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 这么小的数据范围。暴力啊。不幸的是。暴力都写错了。。。写的O(n^2)的,看了下别人的代码,大都是O(n^3)的,最无耻的是题解,竟然是O(n^5) 数据范围小也不能这样啊 include using namespace std; using LL = long long; const int MA 阅读全文
posted @ 2017-10-15 19:47 追梦的蚂蚁 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 求割边个数。Tarjan的板子。。 include using namespace std; const int MAXN = 55; const int MAXM = 500; struct Edge { int to,next; }edge[MAXM]; int head[MAXN],tot; 阅读全文
posted @ 2017-10-15 19:44 追梦的蚂蚁 阅读(154) 评论(0) 推荐(0) 编辑