杂谈
企鹅崽
这个作者很懒,什么都没留下…
展开
-
unique_ptr与shared_ptr的一个坑
当所维护的指针为nullptr时unique_ptr释放时不会调用Deletershared_ptr释放时会调用Deleter在某些情况下,比如 FIFE 类型指针的 Deleter ,即 fclose, 调用 fclose(nullptr) 会抛异常...原创 2018-10-21 21:46:58 · 1443 阅读 · 0 评论 -
POJ 2311 Cutting Game 博弈论 SG 函数的理解
传送门这题是对 SG 函数本质理解的一个绝佳的题目之前我们做题的时候大多都是 Nim 博弈,想当然的认为 SG 函数用二进制数表示一个局面用的是棋子个数,并且也只适用于这个局面,甚至认为 SG 函数只能解决 Nim 类的题目,并且想当然的认为最初状态(即0的时候 SG = 0)实际上,SG 函数的适用范围远远比此广得多。而且 SG 函数用来表示局面的二进制只要合理能够区分局面,并且能够自圆其...原创 2018-11-30 22:55:19 · 255 阅读 · 0 评论 -
洛谷 P2575 高手过招 向右(左)跳动的阶梯博弈的转化
传送门如果仅仅考虑一行的情况,本题可以转化为最普通的阶梯博弈来做,我们会发现这样一个规律:空格子对于一个棋子来说,每次只能走一步,因此每一个空格子都相当于阶梯博弈的空台阶。连续的棋子走到楼梯底部(最右边)的步数是相同的,就好像是在同一个台阶上一样如果把连续台阶中的一个棋子(标号为 m )移动到了右边,那么在 m左边的棋子跳到楼梯底部(最右边)的步数是不变的,在 m 右边的棋子移动到楼梯底...原创 2018-11-30 22:18:51 · 311 阅读 · 0 评论 -
Uva 1378 A Funny Stone Game (ACM ICPC 2006 Asia Regional Contest Beijing A Funny Stone Game)Nim 博弈
传送门王晓珂的题解乍一看非常难理解,且听我慢慢解释。首先考虑这样一个子问题:当前棋子堆的编号为 m , 要求你把这个堆,并且放入两堆编号分别小于 m 的棋子, 这里分别计为 i, j (i, j < m)那么这种情况的 SG 是怎么求的呢?设当前编号 m 对应的局面为 Sm, 那么 Sm 的后继局面由不同状态下的 (Si , Sj )表示, 那么我们枚举所有的 i, j ,并根据...原创 2018-11-30 16:50:29 · 202 阅读 · 0 评论 -
HDU 3037 Saving Beans 组合数递归公式 套卢卡斯定理模板
传送门这题是求 0~m个果子放在不同的 n 棵树上有多少种放置方法首先看 m 个果子的情况,用隔板法来处理这个情况。最多有 n-1 棵树能空着,那就加 n-1 个气泡进去。然后选择 n-1 个位置就把 m+n-1 分成了 n 段(n 棵树的情况)。这个对应的选择方式就是有 C(n+m-1, n-1),其实也就是 C(n+m-1, m)那么果子有 0~m 种,所有总和就是ΣC(n+i-1,i...原创 2018-12-03 13:54:08 · 228 阅读 · 0 评论 -
HDU 5750 Dertouzos 线性素数筛 最大因子
传送门题意大意是:给定的 n, d, 求不超过 n 且最大因子是 d 的数有多少个则 m*d = n 中 d 是最大因子显然如果 m 是非素数的话,那么一定可以分解出一个数,这个数会和 d 构成更大的 n 的因子。此外,如果 d 是非素数的话,那么可能 d 分解出的数乘上某个小于 d 的素数的乘积比 d 本身要大。所以这题中,如果第一次发现 d 是某个素数的整数倍,那么就应当到此为止。为什...原创 2018-12-03 13:54:26 · 319 阅读 · 1 评论 -
HDU 1395 2^x mod n = 1 暴力取模
传送门首先我们发现 n 是偶数的时候显然不可能成立其次,若 n 是 1 的话也显然不可能那么为什么 n 是奇数的话会有解呢?欧拉定理是这样说的:如果 gcd(a,n) = 1, 那么就有 af(n) ≡1(mod n)显然如果 n 是奇数的话和 2 肯定是互质的,所以必定存在 f(n)是本题的解那我们就从 1 开始暴力一边乘一边取模就好了#include <bits/stdc...原创 2018-12-03 13:54:33 · 272 阅读 · 0 评论 -
HDU 4704 Sum 隔板法 快速幂 乘法取模 费马小定理
传送门首先把 N 拆成 N 个 1, 那么要分成 k 份的话,就在 N-1 个空隙里找出 k-1 个插进去就可以了。选法是 C(n-1, k-1) 这是高中组合数学学的隔板法。而这题 k 的取值范围是 0~n-1所以就是求 ΣC(n-1, k-1) (k从 0 到 n),那么就是求 2^(n-1)接下来怎么求呢?脑子里一想,嗯,快速幂,对,快速幂。但是这个幂次有 10^100000 啊,...原创 2018-12-02 16:59:31 · 212 阅读 · 0 评论 -
洛谷 P1288 取数游戏II 图上博弈
传送门先走的人可以控制前进的方向:现行的人走完一条边,如果后选的人再往后走一条边不走完的话,先走的人就直接走完这条边返回,这是后走的人就一定没办法走了,因此他必须走完下一条边。这样,两个人都互相必须走完下一条边,如果先走的人往两边看看,到最近的一个0边有奇数的步数就赢了那么还有一个问题,为什么先走的人一定要控制方向走完呢?如果他往一个方向走了一半的边,那么后走的人可以根据上述讨论判断先走...原创 2018-12-02 14:27:12 · 346 阅读 · 0 评论 -
洛谷 P2252 取石子游戏 威佐夫博弈
传送门也是背一下的结论有两堆各若干个物品,两个人轮流从任意一堆中取出至少一个或者同时从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜利。两堆物品a,b , c=floor((b-a)*((sqrt(5.0)+1)/2)); 若a==c则后手赢,反之先手赢#include <bits/stdc++.h>using namespace std;int main...原创 2018-12-02 14:20:25 · 242 阅读 · 0 评论 -
HDU 2516 取石子游戏 斐波那契博弈
传送门背下来的一个概念题没什么好说的有一堆石子,两个顶尖聪明的人玩游戏,先取者可以取走任意多个,但不能全取完,以后每人取的石子数不能超过上个人的两倍,当石子数为斐波那契数 ,先手输,反之先手赢#include &amp;lt;bits/stdc++.h&amp;gt;using namespace std;int main() { int n, m; cin &amp;gt;&amp;gt; n &amp;gt;&原创 2018-12-02 14:17:13 · 498 阅读 · 0 评论 -
洛谷 P1290 欧几里德的游戏 SG 函数的另类求解
传送门我们用 n, m (n>m) 来表示当前状态显然如果 m = 0 的话是输了,上次对手已经喝完了一个所以这个状态你输了那么考虑 n, m的后继状态有哪些?(n-m,m) (n-2*m,m) (n-3*m,m) .....(n-k*m,m) (m, n%m)所以 SG[n][m] = mex{SG(n-m,m) SG(n-2*m,m) SG(n-3*m,m) .....SG(...原创 2018-12-02 14:05:55 · 292 阅读 · 1 评论 -
HDU 1848 Fibonacci again and again SG 函数的使用
传送门预处理一下 Fibonacci 数列然后预处理 SG 函数即可不同的独立子游戏用异或求得组合结果#include <bits/stdc++.h>using namespace std;const int maxn = 1e3+5;int fib[maxn];int sg[maxn];int k;int used[maxn];void getsg() {...原创 2018-12-02 13:47:17 · 270 阅读 · 0 评论 -
HDU 4764 Stone 巴什博弈
传送门这题简化一下模型就是, 从 1-N 写数字,谁先写到N谁就输了那反过来就是拿石子,N-1 个石子, 谁先拿完谁输。每次最多拿 k 个。那就是裸的巴什博弈了#include <bits/stdc++.h>using namespace std;int main() { int n, k; while (cin >> n >> k ...原创 2018-12-02 13:44:46 · 211 阅读 · 0 评论 -
POJ 2484 A Funny Game 博弈思想:复制对手操作
传送门这一题如果先手不能取完的话,后手一定可以通过取 1 个或者 2 个把局势变成两个对称的局面,后面每一步都可以复制对方的操作,最终自己胜利。#include <bits/stdc++.h>using namespace std;int main() { int n; while (cin >> n && n) { if (n == 1 |...原创 2018-12-02 13:40:13 · 196 阅读 · 0 评论 -
HDU 2147 kiki's game 博弈找规律
传送门这个自己画一下 NP 图看看就知道,只有行列都是奇数的时候才会输,否则都是赢#include <bits/stdc++.h>using namespace std;int main() { int n, m; while (cin >> n >> m && n && m) { if (n%1 &&am...原创 2018-12-02 13:35:33 · 239 阅读 · 0 评论 -
HDU 1847 Good Luck in CET-4 Everybody! 巴什博弈
传送门可以老老实实用 SG 函数求出来这个是常规解法#include <bits/stdc++.h>using namespace std;const int maxn = 2050;int sg[maxn];int used[maxn];void getsg() { sg[0] = 0; for (int i = 1; i < 1001; ++i) { f...原创 2018-12-02 13:33:10 · 243 阅读 · 0 评论 -
卢卡斯定理模板
卢卡斯定理模板适用于求 C(n,m) % p 在 p 比较大又不是特别大的情况。#include &lt;bits/stdc++.h&gt;using namespace std;using ll = long long;const int maxn=1e5+5;ll n,m,p;ll quick_mod(ll a, ll b, ll m) { ll ans = 1; ...原创 2018-12-03 13:54:21 · 312 阅读 · 0 评论