5451 Best Solver 构造共轭复根求递推矩阵&广义斐波那契循环节降幂
题意:有式子y=(5+26)1+2xy=(5+2\sqrt6)^{1+2^x}y=(5+26)1+2x.
给定 xxx和MMM (0≤x<2320 \leq x < 2^{32}0≤x<232) 求y(x)y(x)y(x)的整数部分modmodmod MMM的值是多少(向下取整)
推矩阵资料:http://blog.csdn.net/crazy______/article/details/9021169
广义斐波那契循环节:http://blog.csdn.net/acdreamers/article/details/25616461
构造类斐波那契数列矩阵:http://blog.csdn.net/acdreamers/article/details/8994222
。。真是。。神。。
可以根据式子推出矩阵 f(n+1)=10*f(n)-f(n-1)
注意f(1)=10 f(2)=2
//author: CHC//First Edit Time: 2015-09-20 20:31#include <iostream>#include < ...
hdu 5452 Minimum Cut 求最小割边集的大小
题意:给定图G的一颗生成树,然后求最小割边集的大小,要求割边集中要有且仅有一条生成树边
考虑给定的生成树,求出要把某个子树和其父节点分开的最少割边数,然后枚举除了rootrootroot以外的最小值+1就是答案了。
转换为求将每个子树要分开的最小割边。就是求这颗子树连接到子树外的边的数量。
如果一条边e(u,v)e(u,v)e(u,v)不是树边,那么对于uuu和vvv来说它连接到非它本身子树的另外子树的贡献是1,如果要将这个点和其父节点分开,那么删除的贡献+1,但是注意到边是两条边会遍历两次。
并且e(u,v)e(u,v)e(u,v)这条边并不是lca(u,v)lca(u,v)lca(u,v)这个点的要删除的边。贡献-1。但是遍历两次,所以刚好减去两次。
//author: CHC//First Edit Time: 2015-09-19 19:43#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#incl ...
封装malloc编写一个malloc16使得返回地址%16==0
问题:封装malloc写一个void *malloc16(int _size);使得其的地址刚好是16对其的,也就是说其返回的地址%16==0。然后封装free写一个void free16(void *p);把malloc16分配的空间给回收。。
malloc和free是这么用的。
char *pc=(char*)malloc(1024);free(pc);
这里我想了好一会儿。
第一个想法:分配空间的时候多分配16个空间,然后指向其第一个地址%16==0的地方,把前面多余的空间释放掉。
A:那你怎么释放它?
想了一会儿。发现不能释放。。
再想了一会儿。
第二个想法:在第一个想法基础上。分配空间的时候多分配16个空间,然后找到其第一个地址%16==0的那个地址,用一个结构体保存其malloc分配的值以及malloc16返回的值,free16的时候根据传进来的值来找是否存在分配过这个值。然后找到malloc的这个值,free掉它。
A:怎么保存这个结构体呢。结构体怎么声明?还是只用一个对象
CHC:使用链表或者其他数据结构。
A:用什么数据结构?
CHC:hash每一个malloc16返 ...
hdu 5442 Favorite Donut 最小表示法+KMP
题意:给一个字符串连成环,然后有两种选择的方式,正序和逆序,要求最大字典序,并且输出选择的方向。0为正向 1为反向。如果有相同的输出最小坐标,如果还有相同的输出正向。
把给定的字符串增加一倍,然后再这个字符串中求长度为n的最大字典序。
这个用最大表示法可以求得最小的起始坐标。
然后再把这个字符串反序,再用最大表示法求反序串的最小起始坐标,但是。这个起始坐标在原串中是最大的起始坐标,因此用kmp可以求反序串的最大起始坐标,转换一下就是原串的最小起始坐标了。
代码:
//author: CHC//First Edit Time: 2015-09-14 09:14#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algor ...
C++如何返回函数指针
typedef int (*ft)(int) ;int f(int a){ return a+5;}int (*g(int a,int b))(int){ printf("g():%d\n",a+b); return f;}ft h(int a,int b){ printf("h():%d\n",a+b); return f;}int main(){ printf("%d\n",g(10,10)(2)); printf("%d\n",h(10,50)(10)); return 0;}
奇怪问题----你在飞机上,不能用任何电子设备,求高度
A:你在飞机上,不能用任何电子设备,求高度。
CHC:问机长啊。。
A:这个也算一个方法吧。还有什么其他方法吗?
CHC:光线反射,计算时间,计算一个时间,直接通过公式求。
A:唔~~~也算一个解吧。
其实我那个说法就是胡扯,感觉这个逼装的不是很成功。。。
然后回来之后问欧酱
以下为聊天记录:
做法就是假设可以直接从飞机上垂直看下。用那个方法出距离为t*10.0cm,然后等比求。。
还有一种方法:从飞机上跳下去!。计算你落到地面的时间,乘以一个公式。
HUST 1342 Cheat Secretly 有源汇上下界网络流 最小流
题意:有N个点M条边的单向无环图,先要求必须走某些边,走到没有出边的点可以转移到任意一个点,问最少转移的次数。
最小流建图
入度为0的连st 流量为oooooo
出度为0的连et 流量为oooooo
若某边必须走,那么这条边的下界为1,上界为oooooo
若某边不走,那么这条边的下界为0,上界为oooooo
求最小流
//author: CHC//First Edit Time: 2015-09-10 13:36#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std;typedef long long LL;co ...
SGU 176 Flow construction 有源汇上下界网络流 最小流
题意:有n个节点m根水管的网络,每根水管有个水流的限制,问最少要多少水流能满足整个网络。
最小流
代码:
//author: CHC//First Edit Time: 2015-09-10 10:45#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std;typedef long long LL;const int MAXN=110;const int MAXM=1e+5;const int INF = numeric_limits<int>::max();const LL LL_INF= nume ...
HDU 3157 Crazy Circuits 有源汇上下界网络流 最小流
题意:有N个电子元件,每个电子元件需要一个最少的电能驱动,问最少需要多少电能能把所有元件驱动。
最小流做法
代码:
//author: CHC//First Edit Time: 2015-09-10 01:48#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std;typedef long long LL;const int MAXN=1e+4;const int MAXM=1e+5;const int INF = numeric_limits<int>::max();const LL LL_INF ...
POJ 2594 Treasure Exploration 有源汇上下界网络流 最小流
题意:有一个n点m边的单向无环图,每个士兵可以从某一点沿着某方向出发,并不能返回,问最少要多少个士兵可以遍历全图。
这道题可以当做最小路径覆盖来做。当然也可以当上下界最小流来做。
最小路径覆盖的做法就不说了,百度搜一大把。
上下界最小流建图方式:
把每一个点iii拆开为两个点iii和i′i'i′
对于每个点建边iii->i′i'i′流量下界为111,上界为oooooo
若原图存在边e(u,v)e(u,v)e(u,v),那么建边u′u'u′->vvv,流量下界为000,上界为oooooo
然后建立超级源点sstsstsst和超级汇点eeteeteet
以超级源点和超级汇点跑一遍Dinic
然后再加边e(et,st,0,oo)e(et,st,0,oo)e(et,st,0,oo)
再以超级源点和超级汇点跑一遍Dinic,此时的流量为最小流。
代码1(有源汇上下界网络流 最小流):
//author: CHC//First Edit Time: 2015-09-10 14:35#include <iostream>#include < ...