摘要:
刚开始学习数论,不知道该从哪方面学起,就找了这道题做做,希望通过做题能找到学习数论的方向。花了有两天的时间终于弄懂了这题的思想,恩,数论真的很神奇!题意是:求a^b的所有因子的和取余9901后的结果。用到的知识点有:(1)素因子分解唯一性定理:任意正整数都能用一种方式且只有一种方式写出素数的乘积。如:60 =2^2*3*5(2)约数和公式:将A^B分解成素因数形式:A^B=(p1^k1)*(p2^k2)*(p3^k3)………那么A^B所有因子之和就是 S=(1+p1+p1^2+p1^3+…..p1^k1)*(1+p2+p2^2+p2^3+…..p2^k2)*(1+p3+…)*…………..然后就 阅读全文
摘要:
呃,对自己表示很无奈,明明很清晰地一道题,愣是用了好长时间才做出来,不是没思路,是没整理好思路,没法写代码,好吧,以后要加强!题目大意:所有对4取余余一的数都为H-numbers,只有1和它本身两个因子的H-numbers数为H-primes,有两个H_primes的乘机组成的H_numbers称为H-composites,题目是给你一个数,让你求1到H的所有H-composites。方法很简单,就是筛选法,但是还有一种情况就是,不是完全有两个H_primes组成的数,这种情况要去掉。具体看代码吧。代码:#include <stdio.h>#include <stdlib.h 阅读全文
摘要:
恩,这题做的郁闷,其实就是一道素数筛选加上大数拆分的题,但做的我万分无奈,提交几次都是RE,但把几个关键数组开大了,还是不行,看看网上的解题报告思路没错啊,最后的最后终于找出来了,原来是筛选素数的数组开小了,==!以后一定要细心啊!!代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxx 1000010//这里开小了~~int p[80000];int a[maxx+10];int num;int s[100];void init(){ int i,j; memset(a 阅读全文
摘要:
类似于1961题,不过比1961要简单,只是让求最长的前缀,要注意它要求输入"."时表示输入结束。代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int next[1000005];char str[1000005];void init(){ int i,j; i=0;j=-1; next[0]=-1; while(str[i]!='\0') { if(j == -1 || str[i] == str[j]) { i++;j++; ... 阅读全文
摘要:
一道KMP的题,题目大意是:给你一串字符s,求其前n位重复的次数大于一的所有子串。比如aaa,前两位是aa,所以重复的次数为2,前三位aaa重复的次数为3。这题主要考察KMP算法中的next数组的灵活使用,next函数看过KMP的都知道,他是通过一个串的自匹配求出来的,next[i]一般认为是串s中前i个与后i个字符相等,并且这个i是满足条件的最大的。而通过求next的方法我们轻而易举的知道最大位移length=len(s)-next[len],所以要求前n位的最大重复字串,只要求出next数组就行了。由于本人刚刚看懂KMP的next数组原理,所以本题做起来还是感到有点吃力,呵呵,继续研究KM 阅读全文
摘要:
题目大意是:给你几个DNA序列,让你找到最长的公共子序列。这题的数据量不大,可以用暴搜,就是用到了一个字符串处理函数strstr,它是查找子串在字符串中的位子的,返回值为子串首字母的下标。记下这题留待以后参考.代码:#include <stdio.h>#include <string.h>#include <stdlib.h>int main(){ int n,m,i,j,k,sum; char str[14][65]; char s[65],st[65]; scanf("%d",&n); while(n--) { scanf ( 阅读全文
摘要:
题目很简单,就是给你一个n*m的矩阵,让你求从左下角到右上角的所有路径,简单的组合数学,直接求C(n+m,m)=C(n+m,n)就可以了,只不过,在数据范围上有些需要注意的,如果直接用int型会数据溢出,所以用long long和double型的。提交的时候,TLE了好几次,不知道哪地方错的,后来又把原代码提交了一遍,竟然A了,而且只用了16ms,不知道是不是poj后台有问题。代码:#include <stdio.h>/*double f(double n,double m){ int i,j,s; if(m>n-m) m=n-m; j=1;s=1; for(i=... 阅读全文
摘要:
题目大意是:给你两个数n和m,计算从n到m的所有数的二进制中,0的个数大于1的个数的数的个数。这题用组合数学比较简单,不过要小心,很容易超时的,我就悲哀的RE了两次。对于一个长度为Len的二进制(最高位为1),如何求出他的RoundNumbers呢(假设为用R(len)来表达),分为奇数和偶数两种情况1、奇数情况:在Len=2k+1的情况下,最高位为1,剩下2k位,至少需要k+1为0用C(m,n)表示排列组合数:从m个位置选出n个位置的方法R(len)=C(2k,k+1)+C(2k,k+2)+...+C(2k,2k).由于 A:C(2k,0)+C(2k,1)+...+C(2k,2k)=2^(2 阅读全文
摘要:
最近在做模拟题,感觉自己编码能力太差了,想通过模拟题好好提高一下编码能力!这是一道简单的编码题,本以为可以很快就解决的,结果几乎花了我一上午的时间,失败啊~~~最后看了discuss里给的一组测试数据才把它给过了,唉,考虑问题不全面啊!!直接打表就行了~贴代码:#include<stdio.h>#include<string.h>#include<iostream>using namespace std;struct node{ int d; char mon[10];};node date[260] = {{1,"imix"},{2,& 阅读全文
摘要:
又一道线段树的题~~很简单的一道题,用数组建树很容易理解线段树的内部结构~~题目大意:有N个人排队,给出他们想插队的位置和他们的标识,问最后的序列是怎样的。看代码吧:#include<stdio.h>#include<stdlib.h>#include<string.h>int f[1000005];int pos[200004],val[200004],s[200004];int n;void built(int t,int lc,int rc)//建树过程{ f[t]=rc-lc+1;//保存n前面有多少空位 if(lc==rc) return ; in 阅读全文