各算法经典例题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
矩阵快速幂
hrbust1140
数字和问题
Description
定义一种操作为:已知一个数字,对其各位数字
反复求和,直到剩下的数是一位数不能求和为止。
例如:数字2345,第一次求和得到2 + 3 + 4 + 5 = 14,再对14的各位数字求和得到1 + 4 = 5,得到5将不再求和。
现在请你求出对a^b进行该操作后,求最终得到的数字.
Input
第一行,包含两个数字a(0 <= a <= 2000000000)和b(1 <= b <= 2000000000)
Output
输出对a^b进行操作后得到的数字是什么
#include
#include
#include
#include
#include
#include
using namespace std;
int sum(int x)
{
return ((x+8)%9+1);
}
int g(int a,int k)
{
if(k==0) return 1;
if(k==1) return a%9;
if(k%2==0) return (g((a%9)*(a%9),k/2)%9);
if(k%2==1) return (a%9)*(g((a%9),k-1)%9);
}
int main()
{
int a,k;
while(scanf("%d%d",&a,&k)!=EOF)
{
if(a==0)printf("0\n");
else
printf("%d\n",sum(g(a,k)));
}
}
小乐乐喜欢很多明星,她总是喜欢在没事干的时候念叨自己喜欢的那些明星的名字。有些明星她很喜欢,不自觉的就会念叨很多遍,有的明星则是偶尔想起,随便念叨而已。
给出她一天念叨的明星,请你帮我找出,她念叨最多的明星是哪个呢?
(给你N个字符串,要求输出出现最多的名字以及其出现的次数)
输入:
第一行为一个整数N (1< N < 10000000)
接下来为N行每行一个明星的名字 a (|a| <= 10)。
总共她所知道的明星不超过30000个。
输出:
输出那个出现次数最多名字和其次数。格式参照样例输出
(保证结果唯一)
#include
#include
#define N 300007
struct HB {
int name;
int num;
}hashbox[N];
int hash(int num) {
return num%N;
}
int find(int num) {
int key = hash(num);//得到Hash值
while (1) {
if (hashbox[key].name == -1 || hashbox[key].name == num) return key;//为空或找到num?
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int i;
int maxname = -1;
int maxnum = 0;
for (i = 0; i < n; i++) {
int name;
scanf("%d", &name);
int key = find(name);
HLG 1073 病毒
某种病毒袭击了某地区,该地区有N(1≤N≤50000)人,分别编号为0,1,...,N-1,现在0号已被确诊,所有0的直接朋友和间接朋友都要被隔离。例如:0与1是直接朋友,1与2是直接朋友,则0、2就是间接朋友。那么0、1、2都须被隔离。现在,已查明M个直接朋友关系。如:0,2就表示0,2是直接朋友关系。请你编程计算,有多少人要被隔离。
样例输入:
100 4
0 1
1 2
3 4
4 5
样例输出:
3
#include
#include
using namespace std;
const int N = 100010;
int fa[N];
void init(int n) {
for (int i = 0; i <= n; ++i) fa[i] = i;
}
int find(int u) {
return fa[u] == u ? fa[u] : fa[u] = find(fa[u]);
}
void unin(int u, int v) {
fa[find(v)] = find(u);
int main() {
int n, m;
while(scanf("%d%d", &n, &m) != EOF) {
init(n);//并查集初始化
while(m--) {
int a, b;
scanf("%d%d", &a, &b);
unin(a, b);//a和b并到一个集合上
}
int ans = 0;
for(int i = 0; i < n; ++i) {
if(find(i) == find(0)) {//如果i和0号患病者是一个集合证明他也患病了
ans++;
}