上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 30 下一页
摘要: 思路:找每一个数的循环节,注意优化!!每次找一个数的循环节时,记录其路径,下次对应的数就不用再找了……代码如下: 1 #include 2 #include 3 #include 4 #include 5 #define ll __int64 6 using namespace std; 7 int vis[801],to[801],an[801]; 8 stackp; 9 ll gcd(ll a,ll b)10 {11 if(a<b) swap(a,b);12 while(b){13 ll t=a;14 a=b;15 b=t%b... 阅读全文
posted @ 2013-09-02 21:32 _随心所欲_ 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 很经典的问题,思路转载自http://blog.csdn.net/ACM_cxlove?viewmode=contents题目:这是一个经典问题,有n个海盗,分m块金子,其中他们会按一定的顺序提出自己的分配方案,如果50%以上的人赞成,则方案通过,开始分金子,如果不通过,则把提出方案的扔到海里,下一个人继续。首先我们讲一下海盗分金决策的三个标准:保命,拿更多的金子,杀人,优先级是递减的。同时分为两个状态稳定状态和不稳定状态:如果当n和m的组合使得最先决策的人(编号为n)不会被丢下海, 即游戏会立即结束, 就称这个状态时"稳定的". 反之, 问题会退化为n-1和m的组合, 直 阅读全文
posted @ 2013-09-01 16:37 _随心所欲_ 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 简单的容斥原理!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #define I(x) scanf("%d",&x) 6 #define ll __int64 7 #define MAX 500000 8 using namespace std; 9 int prime[MAX],cnt,e[MAX],num;10 ll a,b,res1,res2;11 bool f[MAX];12 void init()13 {14 cnt=0;15 memset(f,0,sizeof(f));16 for(int i 阅读全文
posted @ 2013-09-01 14:39 _随心所欲_ 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 线段树!!1A代码如下: 1 #include 2 #include 3 #define lson i>1;26 built(lson,l,m,!f);27 built(rson,m+1,r,!f);28 if(T[i].flag) T[i].res=T[lson].res|T[rson].res;29 else T[i].res=T[lson].res^T[rson].res;30 }31 void update(int i,int d,ll p)32 {33 if(T[i].l==d&&T[i].r==d){34 T[i].res=p... 阅读全文
posted @ 2013-09-01 09:52 _随心所欲_ 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 线段树+剪枝优化!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #define ll __int6411 #define pi acos(-1.0)12 #define lson i>1;34 built(lson,l,m);35 built(rson,m+1,r);36 T[i].sum=T[lson].sum+T[rson].sum;37 T[i].flag=T[lson].flag||T... 阅读全文
posted @ 2013-09-01 09:03 _随心所欲_ 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 思路:设: 方程为1*x1 ^ 1*x2 ^ 0*x3 = 0;0*x1 ^ 1*x2^ 1*x3 = 0;1*x1 ^ 0*x2 ^ 0*x3 = 0把每一列压缩成一个64位整数,因为x范围为 (0 1 2 3) 二进制位不超过2, 方程组行数不超过30 则用一个大于60位整数就能表示每一列的状态,然后枚举各列就可以了。如上面方程组第一列为 1 0 1 ,可写为a1 = 11 00 11, 假设x1取2, 则第一列 s1 = 10 10 10, s1&a1 = 10 00 10即为第一列的状态第二列 a2 = 11 11 00 设x2 = 1 则 s2 = 01 01 01, 第二列 阅读全文
posted @ 2013-08-31 21:13 _随心所欲_ 阅读(514) 评论(0) 推荐(0) 编辑
摘要: 思路:将15种分成5类:1.1和2为一类;2.3,4,5,6为一类;3.7,8,9,10为一类;4.11,12,13,14,15为一类;5.15为一类。比较各类的优先级,就会发现放置的顺序为5->2->4->3->1.代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0) 10 #define MAX 50000 11 using namespace std; 12 int 阅读全文
posted @ 2013-08-31 14:42 _随心所欲_ 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 思路:1.首先介绍下4次方的求和公式:S(n)=(6*n^5+15*n^4+10*n^3-n)/30.2.n太大直接求1~n-1中与n互质的数会超时,那么就转换下思路,求不与n互质的数;分析知道当某一个数不与n互质时,他的倍数也一定不与n互质,而且这个数与n具有公共的因子;为了去掉重复的很容易想到容斥原理。对于n=p1^a1*p2^a2*p3^a3……与n不互质的数=(p1+2*p1……)+(p2+2*p2……)-(p1*p2+2*p1*p2……)……;具体看代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #includ 阅读全文
posted @ 2013-08-30 20:29 _随心所欲_ 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 搜索下就可以了……代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int p[10][10],n,a[7],b[7]; 8 string str[10],s; 9 bool flag,vis[10],vis2[10]; 10 bool dfs2(int d) 11 { 12 int i,j; 13 if(d==n){ 14 i=j=0; 15 while(i>t; 68 while(t--){ 69... 阅读全文
posted @ 2013-08-30 20:19 _随心所欲_ 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 思路:分析:假设取的牌顺序是一个序列,那么这种序列在末尾为1时是和取牌序列一一对应的,且是符合“游戏结束时牌恰好被取完”的一种情况。简证:1、在序列中,任一数 i 的后一个数 j 是必然要放在第 i 堆里的。而值为 i 的数有 a[i]个,所以在 i 后面的数也恰好a[i]个,所以a[i]个数被放到第 i 堆,符合题目约束条件。2、在序列中,由于游戏是从第一堆开始的,所以第一个数虽然没有前驱,但是他是放在第 1 堆的。所以如果 1 不为最后一个数,那么第一堆中必然有a[1]+1个数了,不行。3、序列中的最后一个数 记 i ,如果不为 1 ,那么值 i 就只有a[i]-1个后继了。4、结合2、3 阅读全文
posted @ 2013-08-30 20:16 _随心所欲_ 阅读(524) 评论(0) 推荐(0) 编辑
上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 30 下一页