摘要: 自认为sg函数应该算是博弈论中比较经典的东西了。。他几乎可以解决博弈论中的所有问题。你可以将sg函数看作是一个深搜的的过程。而每一堆的石子就相当于图中间的节点。所以说整个sg函数的过程就是在对一个有向无环图进行dfs的过程。sg函数的具体内容可以用一个公式来表示(虽然我最不喜欢公式,不过我还是得写。不然这没法说清楚):sg(x) =mex{sg(y) : y ∈ F(x)}。其中{}内的是一个集合(只要上过高中都应该知道吧),在:右边的是该集合元素所满足的条件。sg(y)为该元素的值(其实就是一个递归的过程)。重点来了。。mex()函数表示是不在该集合中的最小的非负整数的值。比如mex({1, 阅读全文
posted @ 2012-07-31 21:00 77695 阅读(4282) 评论(2) 推荐(2) 编辑
摘要: 方法就是将该组测试数据中所有的数据进行异或计算。得出结果为0则为必输,不为零必胜。#include<iostream>using namespace std;const int MAXM=102;int main(){ int M; while(cin>>M) { int num[MAXM]; if(M==0) { break; } int i=0; for(i=0;i<=M-1;i++) { cin>>num[i]; }... 阅读全文
posted @ 2012-07-31 20:41 77695 阅读(520) 评论(0) 推荐(0) 编辑
摘要: 写出各个状态的必胜还是必输状态即可发现规律。。假设m为2把。。01234567必输必胜必胜必输必胜必胜必输必胜这样就可以看出规律直接判断余数即可。。#include<iostream>using namespace std;int main(){ int c; cin>>c; while(c--) { int n,m; cin>>n>>m; if(n%(m+1)) { cout<<"first"<<endl; }else { cout<<"se... 阅读全文
posted @ 2012-07-31 20:37 77695 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 最恨这种怪里怪气的输入输出了。。尼玛前面非得加个cin>>c。wa爆了也想不出啊。。#include<iostream>using namespace std;const int MAXM=12;typedef long long int llint;llint a[]={23,28,33};int exgcd(int a, int b, int &x, int &y){ if(b == 0){ x = 1, y = 0; return a;} int r = exgcd(b, a % b, x, y); int tmp = x; x = y; y = 阅读全文
posted @ 2012-07-31 20:32 77695 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 真心伤到了。。还想用神马欧拉定理的。。鸟蛋疼伤不起。。鸟暴力就出来了#include<iostream>using namespace std;int main(){ long long int a,n; while(cin>>a>>n) { long long int x=1; while((a*x)%n!=1) { x++; } cout<<x<<endl; } return 0;} 阅读全文
posted @ 2012-07-30 10:57 77695 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 真正的数学题,题目大意是求n^n的最左边的一位数。n最大10^7,如果用for循环100%超时了。百度一下,你就知道。方法如下:设m=n^n,则lg(m)=n*lg(n),所以m=10^(n*lg(n))=10^(整数部分+小数部分),他只要求最左边的,我只要取int(10^(小数部分)),就可以了。。太尼玛是数学题了。。#include<iostream>#include<cmath>using namespace std;int main(){ int t; cin>>t; while(t--) { long double n; cin>... 阅读全文
posted @ 2012-07-29 15:39 77695 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 几乎可以跟普通int一样使用,功能很强大。。只是手敲会很蛋疼。。#include <iostream> #include <cstring> using namespace std; #define DIGIT 4 //四位隔开,即万进制 #define DEPTH 10000 //万进制 #define MAX 251 //题目最大位数/4,要不大直接设为最大位数也行 typedef int bignum_t[MAX+1]; /***********************************... 阅读全文
posted @ 2012-07-28 23:18 77695 阅读(2075) 评论(0) 推荐(0) 编辑
摘要: 想通了的话这道题目很easy。其实对这种什么取个位,取模一个很小的数的都应当想到打表。像这个题目就完全可以作为一个模版使用了。。#include<iostream>using namespace std;const int tab[10][4]={{0,0,0,0},{1,1,1,1},{2,4,8,6},{3,9,7,1},{4,6,4,6},{5,5,5,5},{6,6,6,6},{7,9,3,1},{8,4,2,6},{9,1,9,1}};int main(){ int a,b; while(cin>>a>>b)//求a^b最末位 { a=a%10; 阅读全文
posted @ 2012-07-28 20:19 77695 阅读(163) 评论(0) 推荐(0) 编辑
摘要: catlan数以前用过一回。只是生搬硬套了下公式,没学到什么,网上对catlan数的介绍感觉有点笼统,于是干脆就自己来写一篇了。。令h(0)=1,h(1)=1,catalan数满足递归式: h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2)(原始方程)该递推关系的解为:h(n)=C(2n,n)/(n + 1) (n=1,2,3,...)另类递归式:h(n)=h(n-1)*(4*n-2)/(n+1);前几项为:h(0)=1, h(1)=1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796 阅读全文
posted @ 2012-07-28 10:54 77695 阅读(502) 评论(0) 推荐(0) 编辑
摘要: SPFA算法有两个优化算法 SLF 和 LLL: SLF:Small Label First 策略,设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将j插入队首,否则插入队尾。 LLL:Large Label Last 策略,设队首元素为i,队列中所有dist值的平均值为x,若dist(i)>x则将i插入到队尾,查找下一元素,直到找到某一i使得dist(i)<=x,则将i出对进行松弛操作。 SLF 可使速度提高 15 ~ 20%;SLF + LLL 可提高约 50%。 在实际的应用中SPFA的算法时间效率不是很稳定,为了避免最坏情况的出现,通常使用效率更 阅读全文
posted @ 2012-07-27 09:54 77695 阅读(3803) 评论(0) 推荐(1) 编辑