摘要:
这是一个比较经典的博弈题目,今年网赛好像是南京赛上有一个类似的题目。这种题目是没有一定公式或者函数的,需要自己dp或者搜索解决。题意为分别给你4张写有1,2,3,4,5,6的卡片共24张,每次轮流拿一张卡片,且所有被拿过的卡片的总和不能超过31,谁无法拿出卡片就fail。首先对于每种卡片一共可能有5中存在情况,所以六张卡片一共有5^6种情况,同时我们保存当前拿到的卡片的数量的和,然后记忆化搜就行了。记得每次取最优,同时还要注意除掉拿过的牌,当前是谁第一个拿牌哦。 1 #include 2 #include 3 #include 4 #define maxn 20000 5 using n... 阅读全文
摘要:
这个题目是一个典型的Anti_Sg。我也不知道为什么这么叫,呵呵,反正大家都这么叫,而且我也是听别人说,看别人的日志自己才知道的。题目的意思是给你不同颜色的石子,每次可以去一种颜色的石子若干个(至少为1),取完最后一颗石子的人获胜。由于对于同一种颜色的石子来说,可取的数量是任意的,所以在这个题目里面一个数所对应的SG函数值就是本身。首先我们定义一个数k为当前每一堆石子数量的异或值。对于必胜策略,有两种可能的情况。一。初始状态下,所有的石子堆中石子的个数全为1,且堆数为偶数。二。初始状态下,石子堆中石子的个数不全为1,且k不为0。对于第一种状态是显然的。下面来讨论一下第二种状态吧。初始状态下,因 阅读全文
摘要:
题目的意思是这样的,给定你若干堆石子,每次你可以从任一堆取出某些固定数量的石子,每次取完后必须保证没堆石子的数量不为0,谁无法操作了就算fail。刚刚开始看题目的时候有点也没有思路,甚至连Sg函数也没有听过。后来学习了一番,说说自己的想法吧。_________________有关SG函数的由来,性质及其我个人对sg函数的了解见下一篇日志。这个题目可以这样考虑,由于每次可取的数字是一个给定的集合,我们可以求出所有的数所对应的sg的函数值(我用的是dp,不过好像跟多人喜欢用记忆化搜)。由于博弈论里面的许多奇奇怪怪的定理,最终我们只要求出每一堆的石子数所对应的sg值的总共异或值ans,如果ans不等 阅读全文
摘要:
题目是中文的我就不是说明了,比赛的时候看过题目后队友说是splay来做,细想来省赛不会出这么坑的题目吧。于是比赛还有一个小时左右把该做的都做完了以后,我们队三个人都来思考这个题目了。不过还好很快我们就跳过了这个splay的坑。因为这个题目根本不是spaly,直接用数组模拟链表就行了,所有的操作都可以再O(1)的时间复杂度以内搞定。可以这样做,首先对于每一个数,我们都可以视为一个节点,然后一条链的话就相当于是指针操作了,每个节点都设置两个指针——前驱和后继。设置后继节点是为了应对4操作,因为全部取反只要交换后继和前驱就可以了(其实不用交换也行,只要记录总共要交换多少次就行了,因为换两次就换回来了 阅读全文
摘要:
题目的意思是给你一个机器人,初始的时候在某一个给定的路灯位置,机器人要把路边所有的路灯关掉,每个路灯都有一个距离和一个功率,求要把所有的路灯关掉最小的最终能耗是多少?题目是一个很明显的区间DP。可以这样考虑,机器人关掉一个区间的路灯后,一定停留在该区间的最左端或者最右端,而且必须包括起点,显然。这样我们就可以区间dp了。对于每一个含有初始位置的区间[i,j],只有两种位置使其最终的位置为j,那就是i和j-1。这样就得到了状态转移了。接下来还有一个问题,就是怎么计算能耗呢?这样想,对于每个状态,表示关闭该区间的所有的灯后根据其所停留的位置,所有路灯的最小能耗总和。所以我们可以对于每个路灯,用一个 阅读全文
摘要:
这个题目挺不错的,看到是通化邀请赛的题目,是一个很综合的数论题目。是这样的,给你三个数的GCD和LCM,现在要你求出这三个数有多少种可能的情况。对于是否存在这个问题,直接看 LCM%GCD是否为0,如果不为0的话,就没有满足条件的数哦,反之一定有。接下来问题等价于求三个数GCD为1,LCM为LCM/GCD的种类数了。设这个商为X。 首先我们可以把X因数分解成X=(p1*x1)*(p2*x2)*……*(pn*xn);单独拿出一个素数进行讨论,如果要设ABC分别为满足情况的三个数,那么Xa1,Xa2,Xa3中间必定有一个数为0,否则GCD就不为1了,同时必定有一个最大的为x1这样我们可以得出三大种 阅读全文
摘要:
这个题目巨坑啊。调试的时间加起来绝对超过1天整。不过终于调试出来了,真心感动地尿流满面啊。题目的意思是给你一个区间[A,B],可以从区间里选出任意多个整数,使得这些整数的积是一个不超过 2^126的 平方数。比赛的时候的想法就基本和题解差不多了,但是依然没有能够A出来。神坑啊。知道现在才搞定。首先我们可以知道这个区间的右端点不超过4900,在1-4900里面有70个平方数。所以只要给定的区间包含了一个或多个平方数,我们直接输出最小的那个平方数就可以了哦。这样我们可以保证区间的长度小于139。但是我们仍然无法圆满地解决这个问题,因为2^138依然是一个巨大的数字,时间和空间都是无法承受的。再想优 阅读全文
摘要:
终于有一个SPOJ题目是我自己独立做出来的,ORZ,太感动了。题目意思是给你一个素数,问你一个数r是否满足,r,r^2,r^3,……,r^p-1,全不相同。以前做过这种类型的题目额。是这样的。根据欧拉定理我们知道,对于任意一个x 2 #define ll long long 3 using namespace std; 4 5 ll power(ll a,ll b,ll p) 6 { 7 ll ans=1; 8 while (b) 9 {10 if (b&1) ans=(ans*a)%p;11 b>>=1;12 a=(a... 阅读全文
摘要:
题目的意思很简单。就是要你求出斜率为a/b的一个点在原点,一条边为x=n的RT三角形里面有多少个整数点?看完题目后依然没有思路,依然去看各个神牛写的题解。后来才反应过来。题目的正解应该是这样的。递归求解。假如对于当前dfs(n,a,b)表示我们要求解斜率为a/b,且横坐标不超过n的整点数目。如果a>b,那么我们可以统计在在内部包含的点数为=a/b个等腰直角三角形所包含的点的数目+dfs(n,a%b,b)。好好理解上面这个式子,这也算是第一个难点吧。d=a*n/b;至此,我们可以保证a 2 #define ll long long 3 using namespace std; 4 5 ll 阅读全文
摘要:
SPOJ上的每个题目都做得我泪牛满面。这个题目也是的。题目意思是给你两个分数a/b和c/d,要你求出一个分数p/q,使得a/b1,也就是说c>d,那么就说明p/q=1;否则我们可以把这个不等式式同时取倒数变为 d/c 2 using namespace std; 3 typedef long long ll; 4 5 ll dfs(ll a,ll b,ll c,ll d) 6 { 7 ll k=a/b; 8 a-=b*k,c-=d*k; 9 if (c>d) return 1;10 return dfs( d,c,b,a)*d/c+1;11 }12 13 in... 阅读全文