数论
傻笨
这个作者很懒,什么都没留下…
展开
-
zoj2723
#includeusing namespace std;const int maxn=1000005;int a[maxn];void prime(){ int i,j; a[0]=0;a[1]=0; for(i=2;i a[i]=1; for(i=2;i { if(a[i])原创 2013-04-24 20:24:53 · 527 阅读 · 0 评论 -
杭电3123
这是一道数论题目!利用公式同余取模!思路:n可以达到10^100,很明显不能直接处理。但是发现只要n>m,那么m!+(m+1)!+...+n!这些项都是可以被m整除的,要对m求余,只需要找比m小的阶乘即可,而m的范围为1000000,在O(m)的复杂度下是可以完成的。所以只需判断n是否大于m,若大于m,则取m-1即可,若小于m则不变!其实就是(a+b)%m==(a%m+b%m)%m==(a%m原创 2013-05-14 15:45:58 · 468 阅读 · 0 评论 -
杭电2576
这题首先就要找出通项公式:其前n项和为 Sn = n(n+1)(n+2)/6:还有就是带除式的同余取模:(a/b)%c==a%(b*c)/c;所以Sn可以这样求:s1 = (n(n+1))% (20090524*6);余数里包含6是保证后面的式子可以被6整除。s2 = (s1*(n+2)/6)%20090524;代码如下:#includeint main(){ int原创 2013-05-14 16:50:22 · 435 阅读 · 0 评论 -
HDU 1568
当我看到这题时,发现又是好大的数取前几位时,我懵了,真心不知道用什么方法做,不过上网搜搜别人大牛的解题报告,发现原来用log,发现原来log的作用这么大!原理如下:先看对数的性质,loga(b^c)=c*loga(b),loga(b*c)=loga(b)+loga(c);假设给出一个数10234432,那么log10(10234432)=log10(1.0234432*10^7)=lo原创 2013-06-07 16:57:36 · 582 阅读 · 0 评论 -
CodeForces 109A
这道题目,如果理解了就很简单,思路清晰就会知道解题方法,我是看别人的代码才知道这种方法的,以后可以采用:#include #include #include using namespace std;int main(){ int n; int num4,num7; int i,j; while(scanf("%d",&n)!=EOF) {原创 2013-07-31 19:12:24 · 690 阅读 · 0 评论 -
poj 2773 欧几里得 一个拓展应用
题目大意就是给出n和k求出第k个与n互素的数这里涉及到了 欧几里得的一个重要知识点:如果(a, b)互质的话,那么(b*t+a, b)肯定互质,其中t为正整数!那么这就是以循环周期的了那么这题就可以利用这个来做了,代码和详解如下:#include #include #include #include using namespace std;const int maxn=100000原创 2013-08-06 11:24:00 · 559 阅读 · 0 评论 -
HDU 1124
/* 这题题目意思是求一个数的阶乘得到的数中有多少个0!这题的解题关键是: N!=1*2*3*4*5*6*7*……*N然后每个数都可以分解质因数得到==2^a*3^b*5^c*7^d.... 然后你会发现的就是会产生0的是2*5,所以只要找出N内5的幂次就可以了, 例如 50!,只要找出5的幂次就可以!如下解释: 5 10 15 20 25 30 35 40原创 2013-08-26 16:27:43 · 604 阅读 · 0 评论 -
HDU 1395
这道题目,可以使用笨一点的办法,利用蒙哥马利的快速幂取模的办法做,代码如下:#include #include #include using namespace std;__int64 calcute(__int64 a,__int64 b,__int64 c)//蒙哥马利快速幂取模{ __int64 ans=1; while(b) {原创 2013-08-26 19:23:31 · 528 阅读 · 0 评论 -
HDU 1019
这段时间搞数论,这道题目以前就做过,现在做一下,竟然WA2次,说多了都是泪啊! 题目说好了范围不会超过32位,可这样就是错了,后来改成__int64,发现竟然坑爹, 的过了!!!!无语代码:#include #include #include using namespace std;int gcd(int a,int b){ if(a==0||b==0) {原创 2013-08-26 15:18:24 · 502 阅读 · 0 评论 -
HDU 1211
/* 这题其实不难,只要慢慢看懂题目意思,按照题目说的一步一步来做,就可以AC了; 但是这里有一个地方必须要注意!下面会指出来*/#include #include #include #include using namespace std;__int64 n;__int64 calculate(__int64 k1,__int64 k2){ __int6原创 2013-08-26 17:05:13 · 642 阅读 · 0 评论 -
杭电2548
这题很简单,就是一个纯数学题目,而且很水的!#includeint main(){ int t; double u,v,w,l; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf",&u,&v,&w,&l); printf("%.3lf\n",(l/(u原创 2013-05-08 17:55:00 · 552 阅读 · 0 评论 -
杭电2547
这题认真观察方程式,你会发现点东西,然后把a,b,c,d带进去,你更加会发现,其实就是求两点距离#include#includeint main(){ int t; double a,b,c,d; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf",&a,原创 2013-05-08 16:58:51 · 557 阅读 · 0 评论 -
杭电4510
这题也是属于数学方面的题目!#includeint main(){ int t,a,b,c,d,e,f,h,l,k; scanf("%d",&t); while(t--) { scanf("%d:%d:%d %d:%d:%d",&a,&b,&c,&d,&e,&f); h=c-f; while(原创 2013-05-08 19:02:29 · 500 阅读 · 0 评论 -
杭电2802
这道题只要找出规律就会知道怎么做!一看到这种题目就要想想有没有循环!而这题循环是4018,至于为什么自己可以写代码观察!找出循环点的代码:#include#includeusing namespace std;const int maxn=10000;int a[maxn];int main(){// int f[maxn]; a[1]=1;原创 2013-05-17 16:40:18 · 614 阅读 · 0 评论 -
杭电4535
这道题目属于数学题,类型和拿信封问题一样,利用错排公式!f(n)=(n-1)*(f(n-1)+f(n-2));代码:#includeusing namespace std;const __int64 maxn=1000000000+7;int main(){ int t; int n,i; __int64 a[100]; a[1]原创 2013-05-17 16:59:24 · 477 阅读 · 0 评论 -
hdu1792
这是一道数论题目,不过知道公式就好简单!我是看了大牛的博客才知道的!附上网址提供参考:http://hi.baidu.com/qq258513813/item/8c54f5133dce6fd6bf9042e5代码如下:#include#includeusing namespace std;int main(){ __int64 a,b; whil原创 2013-05-17 15:58:25 · 683 阅读 · 0 评论 -
杭电1262
这是一道数论入门题目!其实很简单,就是先利用素数筛选法,先打表!找出10000以内的素数!#include#includeusing namespace std;const int maxn=10000;int a[maxn];void prime(){ int i,j; for(i=2;i { a[i]=1;原创 2013-05-07 19:03:13 · 657 阅读 · 0 评论 -
杭电1492
这题如果知道一个定理的话就很好做了!定理:一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其中 pi 为素数) , 那么这个数的因子的个数就是,(r1+1)*(r2+1)*...*(rk+1).#include#includeusing namespace std;int main(){ int a1,原创 2013-05-07 19:27:59 · 567 阅读 · 0 评论 -
杭电1576
这题属于数论入门题目,我看了别人的代码,有好几种思路,有扩展欧几里 德的思路,不过我觉得这种思路,我们易于想到!思路:设A = k * 9973 + n ,A/ B = C, C = P * 9973 + x,x即为我们所求的答案。易知,A = k* 9973 + n =B * P * 9973 + B * x,化简后得k * 9973 = B * P * 9973 + B * x - n,因原创 2013-05-07 18:36:13 · 731 阅读 · 0 评论 -
杭电2401
这是一道数学题目,也是一道数论题!#includeint main(){ int n,w,d,q,sum; while(scanf("%d%d%d%d",&n,&w,&d,&q)!=-1) { sum=((1+n-1)*(n-1)/2)*w-q; if(sum==0) printf("%d\n"原创 2013-05-08 16:02:38 · 671 阅读 · 0 评论 -
杭电4143
这题如果用暴力的话,肯定会超时啊!所以必须得好好分析公式! 解题思路:如果要按正常方法从小到大遍历,由于数据量大一定会超时。其实上述式子转化后可以分解因子:n = ( y - x )*( y + x ) ;令 y - x = i,所以有 x + y = n / i ,即 ( n / i - i ) / 2 = x.#include#includeint main原创 2013-05-08 15:28:40 · 513 阅读 · 0 评论 -
杭电2832
这是一道数学题目,其实也是数论题目!要看懂题意就知道怎么做了!题意:100cm的绳子,蜗牛每分钟爬k cm,每分钟后绳子被拉长100cm,问多少分钟到终点蜗牛第一分钟爬绳子的 k/100,第二分钟k/200...也就是求k/100*(1+1/2+1/3+..1/n)>=1的n的最小值代码就很简单了:#includeint a[105];void ff(){原创 2013-05-08 14:05:19 · 496 阅读 · 0 评论 -
HDU 1431
/* 这题要先暴力找出最大的素数时多少,是9989899,所以数组可以不用开这么大!*/#include #include #include #include using namespace std;const int inf=9989900;bool a[inf];void prim(){ int i; int k,t; for(i=1原创 2013-08-27 13:21:25 · 591 阅读 · 0 评论