随笔分类 -  数学题

摘要:思路参考自http://blog.csdn.net/yylxid/article/details/8601075题意:给定一个三角形的周长n, 问能组成的三角形的个数。若三边均不等,则个数加一分析:假定三角形的三条边长分别为x , y , z 其中 x <= y <= z若x已知, 则可得 y + z = n - x令 z - y = t , 则 0 <= t < x (俩边之差小于第三边)将t 代入上式可得 y = (n - x - t) / 2;则 (n - 2x) / 2 < y <= (n - x) / 2 即 n / 2 - x + 1 <= 阅读全文
posted @ 2013-04-01 19:18 枕边梦 阅读(311) 评论(0) 推荐(0)
摘要:View Code #include<iostream>using namespace std;#define MAX 100#define BASE 10000void multiply(int a[], int Max, int b) //大数乘法,注意参数的传递{ int i, array = 0; for (i = Max - 1; i >= 0; i--) { array += b * a[i]; a[i] = array % BASE; // 数组每一位存放大数的四位数字 array /= BASE; }}void ... 阅读全文
posted @ 2012-03-04 15:34 枕边梦 阅读(235) 评论(0) 推荐(0)
摘要:计算方程解的个数很巧妙的hash ,主要是要注意到a,b,c,d已经x的大小范围View Code #include <iostream>#include <algorithm>using namespace std;int hash1[3000005];int main(){ int a, b, c, d, x1, x2, x3, x4, ans; while (~scanf ("%d%d%d%d", &a, &b, &c, &d)) { if (a > 0 && b > 0 && 阅读全文
posted @ 2012-02-22 22:57 枕边梦 阅读(193) 评论(0) 推荐(0)
摘要:hdu3756题意:在一个三维空间里,已知有N个点,求一个最小的圆锥使所有的点都包含其中。分析:主要有俩个步骤,首先就是将三维空间转化为二维空间,将所有的点都转化都同一个平面内考虑,通过将(X,Y,Z) 转化为(sqrt(x*x+y*y),Z),问题就转化为求一条直线将第一象限内的点全部包围起来。即,求满足条件的h,r 使得 h*r*r最小对于单调函数的表达式,我们可以采用二分搜索,但对于这种凸函数或凹函数求极值,我们可以采用三分搜索,给定h的上下限,三分h搜索即可。这里有三分搜索的介绍,挺不错的http://www.crazyhotice.com/2011/07/%E4%B8%89%E5%8 阅读全文
posted @ 2012-02-12 16:06 枕边梦 阅读(641) 评论(0) 推荐(0)
摘要:1.题意解释:意思是有n种彩票,你要想集齐这所有的n种,需要买多少张彩票2.如果有n种,那么我们要求的结果就是n/n + n/n-1 + n/n-2 +...+ n/2 + n/1 ,即n*(1/n + 1/n-1 +...+ 1/2 +1/1) 原理: 我们要集齐n种不同的彩票, 买第一张任意,概率为n/n,买第二张就需要和第一张不同,即剩下的n-1种里哪种都可以,成功的概率是n-1/n...如果我们已经集齐了n-1种,再买彩票我们希望买到最后一种,由于是均匀分布的,所以买到最后一种彩票的概率是1/n.那么从期望的角度来说我们需要买n张,才能买到(当然我们就算买n张也不一定就能买到,也可能买 阅读全文
posted @ 2011-11-13 10:22 枕边梦 阅读(700) 评论(0) 推荐(0)
摘要:题意已经很清楚了,主要就是找递推式:sum[i]=sum[i-1]+2*sum[i-2];需要用到大数,不过这种普通的大数加法已经很熟了#include<iostream>#include<algorithm>using namespace std;int sum[1010][100],len[1010];void init(){ sum[0][0]=0;len[0]=0; sum[1][0]=0;len[1]=0; sum[2][0]=1;len[2]=0; for(int i=3;i<=1000;i++) { int k,j; k=0; for(j=0;j&l 阅读全文
posted @ 2011-11-13 02:12 枕边梦 阅读(278) 评论(0) 推荐(0)
摘要:哈,第二道母函数的题目,哎,不过那是因为函数比较明显G(x)=(1+x+x^2+x^3……+x^300)*(1+x^4+x^8+……)*……(1+x^289)直接模拟咯#include<iostream>#include<algorithm>#include<string>#define maxn 310using namespace std;int p[18]={0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289};int num[maxn+1],num1[maxn+1];void init( 阅读全文
posted @ 2011-11-02 19:39 枕边梦 阅读(174) 评论(0) 推荐(0)
摘要:嘿嘿,先将每一个Fib打表,之后,就是很暴力的在区间内找咯。#include<iostream>#include<algorithm>#include<string>#include<math.h>#define maxn 600using namespace std;int sum[maxn+1][50],len1[maxn+1];int a[50],b[50],la,lb;char str1[110],str2[110];void init(){ sum[0][0]=0;len1[0]=0; sum[1][0]=1;len1[1]=0; su 阅读全文
posted @ 2011-10-31 22:51 枕边梦 阅读(184) 评论(0) 推荐(0)
摘要:哈,用java还有C++各交了一次C++版#include<iostream>#include<algorithm>using namespace std;int sum[201][50],len1[201];void init(){ sum[0][0]=0;len1[0]=0; sum[1][0]=1;len1[1]=0; sum[2][0]=2;len1[2]=0; for(int i=3;i<=200;i++) { int k=0,j; //cout<<i<<endl; for(j=0;j<=len1[i-2];j++) { i 阅读全文
posted @ 2011-10-31 17:15 枕边梦 阅读(196) 评论(0) 推荐(0)
摘要:1058 题意:整体思想是利用已经知道的序列中的元素根据规则去生成新的元素, 如x * 2, x * 3, x * 5, x * 7.假设使用数组a[MAX]进行存储这一序列的所有元素, 首先使a[0] = 1, 表示第一个元素是1, 然后利用4个指针(不是内存指针,呵呵), i2 = i3 = i5 = i7 = 0. 每次我们比较 a[i2] * 2, a[i3] * 3, a[i5] * 5, a[i7] * 7 这四个元素的大小, 把最小的放到序列中, 并把对应的指针+1, 直到生成需要的个数.#include<stdio.h>#include<string.h> 阅读全文
posted @ 2011-10-31 16:16 枕边梦 阅读(1498) 评论(0) 推荐(0)
摘要:题意:找出N个不同的正数(3 <= N <= 18) Ai (1 <= i <= N), 满足:输出各个N个取值下的可能的解;分析:根据 1/(a * b) = 1/a(a + b) + 1/b(a + b) ,可以将一个可能的Ai 拆分成俩个所有,由已知的一组当N等于3时的一组解{2,3,6},将其中一个可能的Ai拆分成俩个。再由N等于4时的解求出N等于5时的解,以此类推;#include<iostream>#include<string.h>#include<algorithm>using namespace std;int a[ 阅读全文
posted @ 2011-10-27 17:04 枕边梦 阅读(168) 评论(0) 推荐(0)
摘要:题意:给出 N,B 和 D:找出 N 个编码(1 <= N <= 64),每个编码有 B 位[二进制](1 <= B <= 8),使得两两编码之间至少有 D 个单位的“海明距离”(1 <= D <= 7)。“海明距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目。看下面的两个编码 0x554 和 0x234 之间的区别(0x554 表示一个十六进制数,每个位上分别是 5,5,4):0x554 = 0101 0101 01000x234 = 0010 0011 0100不同位 xxx xx因为有五个位不同,所以“海明距离”是 5。分析:直接暴力搜索 阅读全文
posted @ 2011-10-27 02:41 枕边梦 阅读(254) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3811题意:给定1~N个数,求出至少满足一个条件的排列总数m个条件如下:Ai 个数为Bi (0<i <m)分析:“本意是一个复杂的容斥原理,但是开场不久被秒杀,才发现又一个比较简单的状态DP方法” 这是武大预赛解题报告上的原句。确实,用容斥原理来解决确实十分蛋疼,最直接就是满足各个条件之后去重,好SB的样子==!。可是用状态DP却很好解决了。我们通过求出一个条件都不满足的排列总数,从而间接的求出满足至少一个条件的排列总数。对于当前的位置,利用前面已经求得的种数求得。结合代码比较好解释,看 阅读全文
posted @ 2011-10-27 00:22 枕边梦 阅读(345) 评论(1) 推荐(0)
摘要:题意:x1 = x – sqrt(y)y1 = y – sqrt(x)给你x1和y1,求x,y,如果有多种,输出x最小的。分析:将方程转化为x = x1 + sqrt(y);y = y1 + sqrt(x);可以发现x >= x1, y >= y1.所以可以用迭代法无限逼近x, y初始x=x1,y=y1;x = x1 + sqrt(y);y = y1 + sqrt(x);#include<iostream>#include<math.h>using namespace std;int main(){ int T,cas=0; double x1,y1; ci 阅读全文
posted @ 2011-10-24 16:03 枕边梦 阅读(235) 评论(0) 推荐(0)
摘要:素数回文先产生所有范围内的回文数,再在范围内找出所有 的素数;嘿嘿,判断素数的方法就太牛逼了,好难理解/*ID: nanke691LANG: C++TASK: pprime*/#include<iostream>#include<fstream>#include<string.h>#include<stdlib.h>#include<math.h>using namespace std;long long b[10000]={5,7,11};int p[8]={4,2,4,2,4,6,2,6};int prime(int n)//判断 阅读全文
posted @ 2011-10-19 16:33 枕边梦 阅读(306) 评论(0) 推荐(0)
摘要:hdu 2522 A simple problem除法的本质,模拟除法的过程即可;中间用一个数组保存出现过的余数,若同一个余数出现俩次,则出现了循环节;考虑可能出现负数;#include<stdio.h>#include<string.h>int f[100000];int hash[100000];int main(){ int t,m,y,cnt,n,i; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n<0) { printf("-" 阅读全文
posted @ 2011-09-24 00:42 枕边梦 阅读(259) 评论(0) 推荐(1)
摘要:Problem Description反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数。现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大。Input第一行输入n,接下来n行测试数据输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].Output输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数.Sample Input32 31 1047 359Sample Output26240Hint2的因子为:1 210的因子为:1 2 5 10N只有 阅读全文
posted @ 2011-09-17 14:29 枕边梦 阅读(278) 评论(0) 推荐(0)
摘要:题目链接:hdu2050折线分割平面题意:求n条折线分割平面的最大数目.分析:我们不忙着解这道题。我们先来看一下N条相交的直线最多能把平面分割成几块很明显,当添加第n条直线时,为了使平面最多,则第n条直线要与前面n-1条直线都相交,切没有任何三条线交于一个点。这样,第n条直线一共有n-1个交点。我们知道,增加n个焦点,则增加n+1个平面。所以n条直线分割平面最大数是1 + 1 + 2 + 3 + ... + n = (n2 + n + 2) / 2 熟悉了线分割平面,现在,我们再来看看,每次增加的不是一条直线,而是两条相互平行的线,那又如何呢?当第N次添加时,前面已经有2N-2条直线了,按我们 阅读全文
posted @ 2011-09-09 09:03 枕边梦 阅读(254) 评论(0) 推荐(0)
摘要:hdu 1131 Count the Trees Catalan数的组合公式为 Cn=C(2n,n) / (n+1);此数的递归公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)卡特兰数的一个应用:给顶节点组成二叉树的问题。 给定N个节点,能构成多少种不同的二叉树? (能构成h(N)个)但因为每一个节点都被命名了,也就是每一个节点都当做 是不同的,所以最后每一个卡特兰数都要乘以n!用组合公式化简得:h(n)=(2n)!/(n+1)! = 2n*(2n-1)* …… *(n+2)。#include<iostream>using namespace std;#defi 阅读全文
posted @ 2011-09-09 08:47 枕边梦 阅读(321) 评论(0) 推荐(0)
摘要:转帖自 http://xuyemin520.is-programmer.com/posts/26317.html还有 http://hi.baidu.com/a363310925/blog/item/aced542d719b2b5d4fc22695.html题意:M+N个人排队买票,票的单价是50¥,每个人只能买一张。 M个人拿50的去买,N个人拿100的去买,然后悲剧的是售票处开始的时候没有钱,所以如果拿100块买票人前面的拿50块买票的人小于或者等于用100块买票的人,这种排队方式就不合法,也就是不能顺利全部都买到票(因为没零钱找了)!卡特兰数的应用该题的公式:(C(m+n, n)-C(m 阅读全文
posted @ 2011-09-08 22:28 枕边梦 阅读(232) 评论(0) 推荐(0)