矩阵快速幂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 <iostream>#include<cstring>#include<iomanip>#include<math.h>#include<stdio.h>#include<algorithm>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");elseprintf("%d\n",sum(g(a,k)));}}小乐乐喜欢很多明星,她总是喜欢在没事干的时候念叨自己喜欢的那些明星的名字。
有些明星她很喜欢,不自觉的就会念叨很多遍,有的明星则是偶尔想起,随便念叨而已。
给出她一天念叨的明星,请你帮我找出,她念叨最多的明星是哪个呢?(给你N个字符串,要求输出出现最多的名字以及其出现的次数)输入:第一行为一个整数N (1< N < 10000000)接下来为N行每行一个明星的名字 a (|a| <= 10)。
总共她所知道的明星不超过30000个。
输出:输出那个出现次数最多名字和其次数。
格式参照样例输出(保证结果唯一)#include <cstdio>#include <cstring>#define N 300007struct 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 40 11 23 44 5样例输出:3#include<cstdio>#include<cstring>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++;}Description 编辑距离(hrbust oj 1284)俄罗斯科学家VladimirLevenshtein 在1965年提出了编辑距离概念。
编辑距离,又称Levenshtein 距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。
许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。
至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。
我们不妨来设计一个程序,计算两个字符串的编辑距离。
Input输入数据的第一行是一个正整数,表示一共有几组数据。
每组数据有两行,每行一个字符串。
* 每个字符串长度不超过1000* 字符串中只含小写英文字母Output对于每组数据,请输出一个整数表示两个字符串的编辑距离。
每个答案占一行。
Sample Input2davidvivianabcaabbccSample Output43尝试用动态规划解决;第一步 尝试表示出状态:用指标函数 d[i][j] 表示 a 字符串的前i 个字符 和 b 字符串的前 j 个字符变成一致所需要的最少操作次数(即编辑距离);则原问题的答案为d[len(a)][len(b)];第二步 尝试写出状态转移的方程:通过观察可以发现初始状态:d[0][i] = i; ( 0 <= i <= len(b) )d[i][0] = i; ( 0 <= i <= len(a) )d[i][j] 的状态可能由以下几种情况转移而来:d[i-1][j] :a 串的前i-1个字符和b 串的前j 个字符已经一致,此时要得到d[i][j] 可以在a 串的末尾加上一个b 串末尾的字符 或者 将b串末尾的字符去掉,即可使的a 串的前i个字符和b 串的前j 个字符变成一致,此时有d[i][j] = d[i-1][j] + 1d[i][j-1]: a 串的前i-1个字符和b 串的前j 个字符已经一致,和上述情况类似,此时有d[i][j] = d[i][j-1] + 1d[i-1][j-1]: 这个时候要分两种状态讨论:a[i] == b[j] , 此时:d[i][j] = d[i-1][j-1]a[i] != b[j] , 此时:d[i][j] = d[i-1][j-1] + 1 (只要将a[i]变成b[j]即可)综上所述得到状态转移方程:d[i][j] = min{ d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+(a[i]==b[j]? 0:1) }实现如下int main(){int T;scanf("%d",&T);while (T--){scanf("%s %s",a+1,b+1);int la = strlen(a+1);int lb = strlen(b+1);for (int i = 1; i <= la; ++i) d[i][0] = i;for (int i = 1; i <= lb; ++i) d[0][i] = i;d[0][0] = 0;for (int i = 1; i <= la; ++i){for (int j = 1; j <= lb; ++j){if ( a[i] == b[j] ){d[i][j] = d[i-1][j-1];}else{d[i][j] = d[i-1][j-1] + 1;}d[i][j] = min( d[i][j], d[i-1][j]+1 );d[i][j] = min( d[i][j], d[i][j-1]+1 );}}printf("%d\n",d[la][lb]);}return 0;}#include <stdio.h>#include <string.h>const int maxn=10000;//提前估计好可能会开的节点的个数int tot; //节点编号,模拟申请新节点,静态申请int trie[maxn][26]; //假设每个节点的分支有26个bool isw[maxn]; //判断该节点是不是单词结尾void insert(char *s,int rt){for(int i=0;s[i];i++){int x=s[i]-'a';//假设单词都是小写字母组成if(trie[rt][x]==0){//没有,申请新节点trie[rt][x]=++tot;}rt=trie[rt][x];}isw[rt]=true;}bool find(char *s,int rt){for(int i=0;s[i];i++){int x=s[i]-'a';//假设单词都是小写字母组成if(trie[rt][x]==0){}rt=trie[rt][x];}return isw[rt];}char s[22];//单词读入int main(){tot=0;//一开始没有节点int rt=++tot;//申请一个根节点memset(trie[rt],0,sizeof(trie[rt]));//初始化根节点memset(isw,false,sizeof(isw));while(scanf("%s",s),s[0]!='#'){//新建字典,以一个'#'结束insert(s,rt);}while(scanf("%s",s),s[0]!='#'){//查单词,以一个'#'结束if(find(s,rt))HDU 1166 敌兵布阵[一维树状数组]Input第一行一个整数T,表示有T组数据。