各算法经典例题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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++;

}

相关文档
最新文档