随笔分类 - 数学题
摘要:嘿嘿,转帖的代码,感觉简单明了大数乘法来的,不过要注意的问题还真多#include <stdio.h>#include <string.h>void times(char *a,char *b,char *t) //大数乘法,a和b相乘,结果赋给t{ int len_a=strlen(a),len_b=strlen(b); int c[10]={0},d[200]={0},e[200]={0}; for(int i=0;i<len_a;i++) c[i]=a[len_a-1-i]-'0'; for(int i=0;i<len_b;i++) d
阅读全文
摘要:hdu 1997汉诺塔题目分析:转自:http://lcc3536.blog.163.com/blog/static/132469917201132283640123/1) 最初我们要判断一下是不是已经完全放好了,这样就不用考虑是不是最优化了, 因为都已经放好了,肯定是最合法的! 或者说全部在 A 上,这是还没开始动作的一个状态,所以也是合法的!2) 否则我们 要对每次状态的最大的那个进行判断,因为我们知道,汉诺塔最大的那个不可能停在 B 上,(假设 最初的时候都在 A 上,要移到 C 上去!),只可能在 A 或者 C 上面!如果是放在 B 上面,停止判断,直接断定他非法~这样我们得出了第二个
阅读全文
摘要:看得迷迷糊糊,还是一知半解啊…………转帖:http://blog.sina.com.cn/s/blog_59e67e2c0100a7yx.html首先引用下leemars的报告:这道题要求N!的最后一个非0数字是多少,如果用一般作法,先统计2和5的个数,然后补乘2,得到的将是TLE。所以还需要再做简化:为了把0去掉,我们把所有的因数2和5都提出来,放到最后再处理。N!中的N个相乘的数可以分成两堆:奇数和偶数。偶数相乘可以写成(2^M)*(M!),M=N DIV 2。M!可以递归处理,因此现在只需讨论奇数相乘。考虑1*3*5*7*9*11*13*15*17* ... *N(如果N为偶数则是N-1
阅读全文
摘要:转自http://xuyemin520.is-programmer.com/posts/26265.html题目:就是给你N个房间,然后每个房间1把钥匙,你最初手里没有任何钥匙,要靠破门而入!这里只有第一个房间不能破门进去,其他都可以,给你房间数N,和最多能破门的个数,让你求能全部把房间打开的概率!题目分析:又是是我的第一次啊!受教育了?有木有?这种题目是斯特林第一类数的应用,虽然很裸,但是很经典啊 !首先这题其实让我们求的是给 N个元素,让我们求K个环排列的 方法数。斯特林第一类数的第推公式:S(N,0)=0;S(N,N)=1;S(0,0)=0;S(N,K)=S(N-1,K-1)+S(N-1
阅读全文
摘要:其实,说得简单明了的一点,就是求俩个分数的最小公倍数;方法:先将俩个分数转换成最简形式,在求出俩个分母的最大公约数最为最小公倍数的分母,求出俩个分子的最小公倍数做为最小公倍数的分子即可;当我把我的代码改得面目全非的时候,我才发现了我WA的原因,求最小公倍数的时候int lcd(int u,int v,int h){ return(u*v/h);//这步溢出了}应该改为int lcd(int u,int v,int h){ return(u/h*v);}#include<iostream>using namespace std;int n;int hcf(int a,int b){
阅读全文
摘要:题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1568我的天呐,写了那么久的代码,拼命地想省内存,可是还是没用呀,那么大一个数,数组至少就要那么大了呀,看看我那MLE的代码吧,原因是我用了递推公式,下面一个是直接用公式计算每一个的MLE的代码#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>using namespace std;int sum[2][200];int
阅读全文
摘要:先看下资料,数学公式来的资料转自:http://jackiesteed.blog.163.com/blog/static/165506750201051552930758/约瑟夫环问题是一道经典的数据结构题目问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。一般我们采用一个循环队列来模拟约瑟夫环的求解过程,但是如果n比较大的时候,采用模拟的方式求解,需要大量的时间来模拟退出的过程,而且由于需要占用大量的内存空间来模拟队列中的n个人,并不是一个很好的解法。在大部分情况下,我们仅仅需要知道最后那个人的编号,而不是要来模拟一个这样的
阅读全文
摘要:经典的统计题目题意:给出N个人的坐标,求出在以r为边的正方形中最多的人数分析:因为正方形的位置并未固定,而要满足覆盖最多的点,则以某一个点的y坐标作为下边界一定有最优解,所有:首先对N个人的纵坐标进行排序,枚举所有Y坐标(正方形下边界),找出满足以当前y坐标为下边界的正方形内的点,再枚举满足条件的点X坐标,计算以r为边最多可覆盖的点,总复杂度O(n^2)代码:#include<iostream>#include<algorithm>using namespace std;struct node{ int x,y;}p[1001];int n,ans,r,xx[1001]
阅读全文
摘要:公式:p+q-GCD(q,p)具体分析:http://www.shuxueweb.com/shuxuebolan/qiuti/shuxuebolan_9112.html#include<iostream>using namespace std;int hcf(int a,int b){ int r=0; while(b!=0) { r=a%b; a=b; b=r; } return(a);} int main(){ int q,p; while(cin>>q>>p) { cout<<q+p-hcf(q,p...
阅读全文
摘要:(1)纯循环小数(仅指整数部分为0的)化成分数时,分数的分母由9组成,9的个数等于一个循环节的位数,分子是由一个循环节的各位数字组成。如:0,234234234....=234/9990.111111=1/9 (2)非纯循环小数化成分数时,分母由9和0组成,其中9的个数等于一个循环节的位数,0的个数等于非循环部分的位数。分子是从小数点后的第一位到第一个循环节的末位组成的数减去非循环部分。如:0,76345345345。。。。=(76345-76)/99900 0.0243434343.........=(243-2)/9900 0.811111。。。。=(81-8)/90=73/90#incl
阅读全文
摘要:几道简单的关于素数的题目,嘿嘿,基本都是用了筛选法pku3006#include<iostream>#include<math.h>#define MAXN 1000001using namespace std;bool prime[MAXN];void init(){ prime[1]=false; prime[2]=true; for(int i=3; i<MAXN; i++) if(i%2) prime[i]=true; else prime[i]=false; for(int i=3; i<=sqrt((double)MAXN); i++) ...
阅读全文
摘要:额,还是大数问题,不难,就是,居然来一个这么变态的测试数据1000000000输出 0#include<iostream>#include<math.h>#include<string.h>using namespace std;int main(){ char str[101]; int sum[110],j,k,cas,num; num=0; cin>>cas; while(cas--) { if(num++) cout<<endl; memset(sum,0,sizeof(sum)); while(cin>>str)
阅读全文
摘要:额,同一个代码,贴了三道题 ,都不用改的,卡特兰数的应用,还有hdu1130,hdu1134出栈次序问题,其实就是卡特兰数的应用卡特兰公式:令h(1)=1,h(0)=1,catalan数满足递归式: h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2) 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1); 该递推关系的解为: h(n)=C(2n,n)/(n+1) (n=1,2,3,...)用递归式来做,接下来就是一个大数问题了,(4*n-2)/(n+1) 不能直接算,未必整除呀ORZ先算(4*n-2)*h(n
阅读全文
摘要:所谓的灌水问题,坑爹啊,为什么这题是在搜索的课件里,我郁闷了好久以下是资料的链接,还有我自己的代码http://blog.csdn.net/lipengyuan_fan/article/details/4369709倒水问题的经典形式是这样的: “假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。” 当然题外是有一些合理的限制的,比如从池塘里灌水的时候,不管壶里是不是已经有水了,壶一定要灌满,不能和另一个壶里的水位比照一下“毛估估”(我们可以假设壶是不透明的,而且形状也不同);同样的,如果要把水从壶里倒进池塘里,一定要都倒光;
阅读全文
摘要:还是素数筛选法,数组得开大点#include<stdio.h>#include<math.h>int a[100001];void init(){ int n=32768+1; for(int i=2;i<=n;i++) { if(a[i]==0) for(int j=i+i;j<=n;j+=i) a[j]=1; }}int main(){ int i,j,n; init(); while(scanf("%d",&n)==1) { int count=0; for(int i=2;i<=n/2;i++) { if(a[i]=
阅读全文
摘要:筛选法,嘿嘿,看了大牛的代码的……#include<stdio.h> #include<string.h> int n,num[40000]; int main( ) { int t; scanf( "%d",&t ); num[0] = num[1] = 0; while( t-- ) { scanf( "%d",&n ); memset( num,0,sizeof( num ) ); for( int i = 2; i <= n / 2; ++i ) for( int j = 1; j * i <
阅读全文
摘要:积分的题目还是第一次做,直接用到了高数的知识,恩,还有,曲线的方程用顶点式y = a(x-h)^2+l, (h,l) 为顶点注意精度问题#include<stdio.h>#include<math.h>double x,y,x2,y2,x3,y3,area;double l,h,a,k,b;double f(double x){return (a*x*x*x/3)-(a*h+k/2)*x*x+(a*h*h+l-b)*x;}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%
阅读全文
摘要:哈,原来大数用整型数组模拟更快,更容易用呀一个位可以保存大数中的四个位甚至更多,而且效率极高,看完这方面的资料,真是后知后觉啊,自己写了一下代码,确实好写很多#include<stdio.h>#include<stdlib.h>#include<string.h>int res[7500][670],len[7500];void init(){ res[1][0]=1;len[1]=1; res[2][0]=1;len[2]=1; res[3][0]=1;len[3]=1; res[4][0]=1;len[4]=1; int k=0,j; for(int i
阅读全文
摘要://求多边形的重心算法//说明://求多边形重心并不是简单的把求三角形的重心公式推广就行了//我的算法是在平面上取一点(一般取原点, 这样可以减少很多计算, 而且使思路更清晰^_^)//这样就得到了N个三角形OP[i]P[i+1](其中点的顺序要为逆时针的),//分别求出这N个三角形的重心Ci和面积Ai(注意此处面积是又向面积, 就是用叉乘求面积时保留其正负号)//在求出A = A1+A2+...+AN(同样保留正负号的代数相加)//最终重心C = sigma(Ai+Ci)/A;#include <iostream>#include <cmath>#include &l
阅读全文
摘要:题目不难,还是利用向量叉积,看图接下来,只需按逆时针一次判断一边和一点的关系,若叉积>0,则表示存在大于180的内角,即为凹多边形#include<iostream>#include<math.h>using namespace std;struct node{ int x,y;}p[100];int seg(node p1,node p2,node p3){ int d=(p3.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p3.y-p1.y); if(d<0) return 1; else return 0;}int main(){
阅读全文

浙公网安备 33010602011771号