随笔分类 -  数学

HDU 1028 整数划分 母函数
摘要:这是一道整数划分的题目,用到的算法思想是母函数,当然还有其他的比如递推,DP可以用来解决这道题,关于母函数的思想可以参考http://www.wutianqi.com/?p=596/** Author:lonelycatcher* problem:hdu 1028* Type: 母函数,拆分数,整数划分*/#include<stdio.h>#include<string.h>#include<cstdlib>#include <iostream>using namespace std;int N;__int64 c1[125];__int64 c 阅读全文

posted @ 2011-07-30 15:59 lonelycatcher 阅读(1186) 评论(0) 推荐(0)

HDU 1027 全排列
摘要:这是一道排列的题目,北大的程序设计书里面有这道题,讲的挺细的,可以去看看,两种方法/** Author:lonelycatcher* Problem:HDU 1027* Type:全排列*///方法一:/*#include<stdio.h>#include<string.h>#include<cstdlib>#include<algorithm>using namespace std;int n,m;int sequence[1010];int main(){setbuf(stdout,NULL);int i,j,k;while(scanf(&q 阅读全文

posted @ 2011-07-29 12:24 lonelycatcher 阅读(1168) 评论(1) 推荐(0)

HDU 1023 卡特兰数
摘要:参见《组合数学》第八章 特殊计数序列 P185,因为涉及到大数,所以用java 处理起来比较方便import java.util.*;import java.io.*;import java.math.*;public class Main { public static void main(String[] args) { BigInteger []h=new BigInteger[101]; h[0]=new BigInteger("1"); h[1]=new BigInteger("1"); for(int i=2;i<=100;i++) { 阅读全文

posted @ 2011-07-26 11:25 lonelycatcher 阅读(268) 评论(0) 推荐(0)

HDU 1019 LCM 求最小公倍数
摘要:#include<stdio.h>#include<cstdlib>#include <iostream>using namespace std;int GCD(int x,int y){ if(!x || !y)return x>y?x:y; for(int t;t=x%y;x=y,y=t); return y;}int LCM(int x,int y){ int gcd=GCD(x,y); return x/gcd*y;}int ans;int main(){ setbuf(stdout,NULL); int T,number,i,inter; s 阅读全文

posted @ 2011-07-25 10:54 lonelycatcher 阅读(247) 评论(0) 推荐(0)

HDU 1018 Big number 斯特林公式,lnN!=NlnN-N+0.5*ln(2*N*pi)
摘要:这道数学题用到了数论中的一个公式,叫做斯特林公式,lnN!=NlnN-N+0.5*ln(2*N*pi)//============================================================================// Name : HDU.cpp// Author : lonelycatcher// Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//================================ 阅读全文

posted @ 2011-07-25 09:56 lonelycatcher 阅读(1471) 评论(0) 推荐(0)

平面最近点对的分治算法
摘要:上一页 | 返回目录 | 下一页最接近点对问题 转自参考解答 这个问题很容易理解,似乎也不难解决。我们只要将每一点与其他n-1个点的距离算出,找出达到最小距离的两个点即可。然而,这样做效率太低,需要O(n2)的计算时间。在问题的计算复杂性中我们可以看到,该问题的计算时间下界为Ω(nlogn)。这个下界引导我们去找问题的一个θ(nlogn)算法。 这个问题显然满足分治法的第一个和第二个适用条件,我们考虑将所给的平面上n个点的集合S分成2个子集S1和S2,每个子集中约有n/2个点,·然后在每个子集中递归地求其最接近的点对。在这里,一个关键的问题是如何实现分治法中的合并步骤,即由S1和S2 阅读全文

posted @ 2011-07-18 09:07 lonelycatcher 阅读(7005) 评论(0) 推荐(0)

HDU 1005 number sequence
摘要:一道数学题,纠结了好长时间,10^8 的话,用O(N)的算法一定会超时,考虑到模7,是一个循环问题,重要的是找出循环节,注意不一定是从f[1]出开始循环。。。#include<iostream>#include<cstdio>using namespace std;int f[100];int A,B;long long N;int find(int left,int right){ for(int i=1;i<left;i++) { if(f[i]==f[left]&&f[i+1]==f[right])return i; } return 0;} 阅读全文

posted @ 2011-07-16 13:25 lonelycatcher 阅读(258) 评论(0) 推荐(0)

POJ 1012
摘要:参考:http://blog.csdn.net/ericxieforever/archive/2008/04/27/2335646.aspx先引入Joseph递推公式,设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0;依次我们可以来做测试,只要前k轮中只要有一次f(i)<k则此m不符合题意。接下来我们考察一下只剩下k+1个人时候情况,那么依题意则这一轮出局的人要么在上一轮出局人的左边,要么就在右边,设上一轮出局的人为x,则必有m%(k+1)==0或1(还不明白就看下面两个序列表示的k+2人的情况(G表示好人,共有k 阅读全文

posted @ 2011-06-06 11:10 lonelycatcher 阅读(165) 评论(0) 推荐(0)

HDU 3006 The Number of set
摘要:转自:http://zc634579757.blog.163.com/blog/static/1244974622009716104841721/这题真是让我看到了位运算和状压DP的神奇之处! 这题就是用一个二进制数保存一个集合的元素 比如一个集合中有两个元素 1 3 那就用5 (101)表示这个集合就是用0 1 来表示这个集合中一个数存不存在 再比如 一个集合有三个元素 1 4 5 就在这几个位子上标为1,那就用25 (11001)来表示这个集合!在借助于位运算的或( | )就可已达到合并集合的目的,比如一个集合(14 )和一个集合(1 2 3)进行合并 那就是 (9)1001 | 111( 阅读全文

posted @ 2011-05-27 18:02 lonelycatcher 阅读(695) 评论(2) 推荐(0)

快速幂取余
摘要:快速幂取模算法,留着以后慢慢研究long long modExp(long long a,long long b,long long n){ long long t,y; t = 1; y = a; while(b){ if(b % 2) t = t * y % n; y = y * y % n; b >>= 1; } return t;} 阅读全文

posted @ 2011-05-27 14:07 lonelycatcher 阅读(684) 评论(0) 推荐(0)

HDU 2136 largest prime factor
摘要:<code>#include<stdio.h>__int64 n;__int64 prime[1000000];int main(){ __int64 i,j; __int64 locate=0; for(i=2;i<1000000;i++) { if(prime[i]==0) { locate++; for(j=i;j<1000000;j+=i) { prime[j]=locate; } } } while(scanf("%I64d",&n)!=EOF) { printf("%I64d\n",prime[n] 阅读全文

posted @ 2011-05-25 20:40 lonelycatcher 阅读(247) 评论(0) 推荐(0)

线性素数打表
摘要:转自:http://blog.sina.com.cn/s/blog_787c1f7b0100s0yx.html参考链接:http://leonbule.blogbus.com/logs/5342169.htmlhttp://kmplayer.javaeye.com/blog/606352原理:1. 任何一个合数都可以表示成一个质数和一个数的乘积2. 假设A是一个合数,且A = x * y,这里x也是一个合数,那么有:A = x * y; (假设y质数,x合数)x = a * b; (假设a是质数,且a < x)-> A = a * b * y = a * Z (Z = b * y) 阅读全文

posted @ 2011-05-25 20:05 lonelycatcher 阅读(589) 评论(0) 推荐(0)

HDU 1061 Rightmost Digit
摘要:这道题看起来很吓人,数据量也很大,其实是有技巧的,最后一位就是N对10取模以后的N次方的最后一位,有10中可能,即从0到9,而观察可以发现,0到9这10个数不断的与自己相乘,最后一位是有周期的,下面的就很简单了#include<iostream>using namespace std;long long N;int main(){ int T; cin>>T; while(T--) { cin>>N; if(N==0||N%10==1) { cout<<1<<endl; continue; } int mod=N%10; if(mod 阅读全文

posted @ 2011-05-24 17:11 lonelycatcher 阅读(177) 评论(0) 推荐(0)

整数划分
摘要:关于放苹果的那些事。。。。。。。。。。 今天偶然看到一个关于整数划分的算法, 仔细看了后,我想到了放苹果的事,其实这个问题困扰了我很久,一直没想明白放苹果的原理。记得当时做这个题的时候,自己的分析的方法和整数划分的算法是一样的,就是没想到用递归就能做出来,看了一位dn的博客,终于明白是怎么回事了.........例子,整数划分的思想如下:整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。如6的整数划分为 65+14+2,4+1+13+3,3+2+1,3+1+1+12+2+2,2+2+1+1,2+1+1+1+11+1+1+1+1+1 共11种。下面介绍一种通 阅读全文

posted @ 2011-05-22 22:21 lonelycatcher 阅读(416) 评论(0) 推荐(0)

HDU 1060 Leftmost Digit
摘要:一看这道题,确实没有思路,数据范围那么大,根本就没法做……后来,看到了一个人的分析,是这样转换的m=n^n;两边同取对数,得到,log10(m)=n*log10(n);再得到,m=10^(n*log10(n));然后,对于10的整数次幂,第一位是1,所以,第一位数取决于n*log10(n)的小数部分总之,log很强大啊,在求一个数的位数上,在将大整数化成范围内的整数上,在指数问题上#include <iostream>#include<math.h>using namespace std;int T;double a;long long b;double c;long 阅读全文

posted @ 2011-05-22 22:19 lonelycatcher 阅读(281) 评论(0) 推荐(0)

HDU 1066阶乘最后一个非零位
摘要:转帖:http://blog.csdn.net/anchor89/archive/2010/09/29/5913246.aspx最开始的思路很简单,设一个循环变量从1-n,依次乘到累乘变量s中,只保留s的最后几位非零数字,结果hll的错了,原因主要有两个:1是速度慢,2是在乘的过程中会碰到5的倍数,而每乘一个5的倍数,末尾就会产生一个零,为了保持最后几位都是非零数字,就需要整体右移,这样一来最高位的数字就变得不精确,经过多次右移后,s就完全不是精确的结果了,当然没法得到答案. 这个思路被断掉后一时没了想法,最后多亏老马的提示:末尾0产生的原因是乘式中有2*5这样的因子,因此在计算的时候就该先将 阅读全文

posted @ 2011-05-22 22:16 lonelycatcher 阅读(3864) 评论(0) 推荐(2)

导航