摘要: 题目大意是输入一个数N,输出N的N次方的个位,N非常大,直接算会非常慢,所以用二分求幂,即分治,和二分查找思想类似,几乎每次将规模缩小一半,将复杂度由O(n)降到了O(logn),另外,n*n%m=(n%m)*(n%m)%m#include __int64 pow(__int64 n,__int64 m){ __int64 u; if(m==1) return n%10; if(m%2==0) { u=pow(n,m/2)%10; return u*u%10; } else { u=u=pow(n... 阅读全文
posted @ 2013-08-07 16:00 贝尔摩德 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 题目大意是将集线器连起来成一棵树,且最长的边必须是所有方案中最小的。对于一个图的最小生成树来说,它的最大边满足在所有生成树的最大边里最小。因为去掉最小生成树的最长边后形成两个集合,无论是什么样的生成树都必须要在这两个集合间有边,而刚刚去掉的那条边正是这两个集合间最短的(否则可以换成一条更短的形成一棵更小的生成树,矛盾),所以直接求最小生成树即可。#include #include int p[1010],n,m,max,sum,ans[15010][2];struct edge{ int u,v,w;}ed[15010];int cmp(const void *a,const void *b) 阅读全文
posted @ 2013-08-07 14:44 贝尔摩德 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 主要思路就是先把已存在的道路用并查集并起来,再将排序后的且不存在的边遍历一遍,若边的两顶点不在一个集合内,则将两顶点并起来且将费用cost加上该边的权值另外在网上看到另一种好的思路就是将已存在的边的权值置为0,然后进直接用最小生成树算法#include #include #include using namespace std;int p[105],n,m;struct edge{ int u,v,w; int flag;}ed[5000];int get(int x){ if(p[x]==x) return x; else return p... 阅读全文
posted @ 2013-08-07 14:09 贝尔摩德 阅读(137) 评论(0) 推荐(0) 编辑