随笔分类 - 数论
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1134此题考查的是卡特兰数,由于卡特兰数很大,所以考虑大数处理。卡特兰数的前几项为:h(0)=1;h(1)=1;h(2)=2;h(3)=5……卡特兰数的递推公式为:h(n)=h(n-1)*(4*n-2)/(n+1);非递推公式为C(2n,n)/(n+1);此题用递推公式求解,并用到大数的乘法和大数的乘法处理,本题对卡特兰数的前100项做了预处理:AC代码如下:#include<iostream> //卡特兰数求法 递推公式h(n)=h(n-1)*(4*n-2)/(n-1)using na
阅读全文
posted @ 2012-05-03 22:26
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1262用筛选法求稍微方便一些:#include<iostream>using namespace std;#include<math.h>#define M 10005int a[M+1]={1,1};void is_prime() //预处理{ int m=(int)(sqrt(M*1.0)); for(int i=2;i<=m;i++) if(a[i]==0) for(int j=i*i;j<=M;j+=i) a[j]=1; }int main(){ ...
阅读全文
posted @ 2012-05-02 17:14
龙杉老师
摘要:有一块椭圆的地,你可以在边界上选n个点,并两两连接得到n(n-1)/2条线段。它们最多能把土地分成多少个部分?解:最优方案是不让三条线段交与1点。欧拉公式:V-E+F=2.其中V是顶点(即所有线段的断点数加上交点数),E是边数(即n段椭圆弧加上这些线段被切成的段数),F是面数(即土地块数加上椭圆外那个无穷大的面)。换句话说,只需求出V和E,答案就是E-V+1;不管是定点还是边,计算时都要枚举一条从固定点出发(所以最后要乘以n)的所有对角线。假设该对角线左边有i个点,右边有n-2-i个点,则左右两边的点两两搭配后在这条对角线上形成了i*(n-2-i)个焦点,得到了i*(n-2-i)+1条线段。注
阅读全文
posted @ 2012-04-29 13:26
龙杉老师
摘要:果园里的树排列成矩阵。他们的x和y的坐标均是1~99的整数。输入若干个三角形,依次统计每个三角形内部和边界上共有多少棵树。输入:1.5 1.5 1.5 6.8 6.8 1.510.7 6.9 8.5 1.5 14.5 1.5此题用三角形有向面积来解,求有向面积2倍的函数为:double area(double x0,double y0,double x1,double y1,double x2,double,y2){ return x0*y1+x2*y0+x1*y2-x0*y2-x1*y0-x2*y1;}若求其面积,即没有方向的:则为fabs(S)/2;可以用行列式来记...
阅读全文
posted @ 2012-04-29 13:03
龙杉老师
摘要:二分法数学的魅力:幂运算满足结合律n为偶数: a^n=a^(n/2)*a^(n/2);n为奇数: a^n=a^(n/2)*a^(n/2)*a;保存a^(n/2),很容易求出a^n; 大数取模(a*b)%m=(a%m*b%m )%m;求(2^100000000000000)%10000;提示:二分法,速度惊人的快速幂!!!此题一般的数代码如下:#include<iostream>using namespace std;#include<math.h>__int64 fun(__int64 m,__int64 n,__int64 k){ __int64 s; if(n==1
阅读全文
posted @ 2012-04-25 23:52
龙杉老师
摘要:所谓整数拆分即把整数分解成若干整数的和(相当于把n个无区别的球放到n个无标志的盒子,盒子允许空,也允许放多于一个球)。整数拆分成若干整数的和,办法不一,不同拆分法的总数叫做拆分数。母函数法求一个整数的拆分:#include <iostream> //母函数法求一个整数的划分using namespace std;int c2[1000],c1[1000];int main(){ int n; while(1) { cin>>n; int i,j,k; for(i=0;i<=n;i++) { c2[...
阅读全文
posted @ 2012-04-24 00:08
龙杉老师
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536只要构造好SG函数就行:AC代码:#include<iostream>using namespace std;#include<string.h>int a[110],k; //k为全局变量int sg[10010],flag[110];void SG() //SG函数{ int i,j; for(i=0;i<=10000;i++) { memset(flag,0,sizeof(flag)); for(j=0;j<k;j++) ...
阅读全文
posted @ 2012-04-21 23:49
龙杉老师
摘要:小于x且与x互素的正整数的个数如果x为素数,则欧拉函数等于x-1求法:将x分解为p1^n1*p2^n2*…pk^nk,则欧拉函数=x*(1-1/p1)*(1-1/p2)…*(1-1/pk);代码如下:#include<iostream>using namespace std;#include<string.h>#include<math.h>#define M 10000int p[M],a[M+1],p1[M];void prime(){ memset(a,0,sizeof(a)); int i,j,k=0,m; m=(int)(sqrt(M*1.0));
阅读全文
posted @ 2012-04-21 15:47
龙杉老师
摘要:已知n=p1^a1*p2^a2…*pk^ak,(也就是n的素数分解),求n的约数个数。分析:n的约数一定包含素因子中的某几项,对于n的某个素因子pi,它在约数中的指数可以是0,1,2…ai共ai+1种情况,根据乘法原理:n的约数个数=(a1+1)*(a2+1)…*(ak+1)自己写的代码如下:#include<iostream>//求n以内的公约数的个数using namespace std;#include<string.h>#include<math.h>#define M 10000int p[M],a[M+1],b[M],c[M];void prim
阅读全文
posted @ 2012-04-21 14:43
龙杉老师
摘要:^^^转载请注明出处~~~The Sprague-Grundy theory of impartial games公平游戏的Sprague-Grundy定理公平游戏是一种双人游戏,在游戏中双方都有完整的信息,没有牵涉,任何状态的合法操作对双方来说都是相同的。一个公平游戏可以抽象地用一个有向无环图来表示,这个图中每个点都对应这一个状态,每条有向边代表从一个状态到另一个状态的合法操作。我们可以想象一个代币最初放在某个点上,然后两个玩家轮流将其从当前的点移动到它的后继点。当代币移动到汇点时游戏结束,汇点是一个没有出度的点,最后一个需要操作的玩家就是胜者。P- 和 N-状态如果双方都按照最佳策略进行游
阅读全文
posted @ 2012-04-21 09:58
龙杉老师
摘要:甲乙两人面对若干排石子,其中每一排石子的数目可以任意确定。例如图所示的初始局面:共n=3排,其中第一排的石子数a1=7,第二排石子数a2=3,第三排石子数a3=3。两人轮流按下列规则取走一些石子,游戏的规则如下:每一步必须从某一排中取走两枚石子;这两枚石子必须是紧紧挨着的;如果谁无法按规则取子,谁就是输家。 解:用符号#S,表示局面S所对应的二进制数。用符号$(x),表示局面(x)的下一步所有可能出现的局面的集合。定义集合g(x):设$(x)={S1, S2, …, Sk},则g(x)={#S1, #S2, …, #Sk}。函数f满足要求的一个充分条件f(a1)不属于集合g...
阅读全文
posted @ 2012-04-20 20:06
龙杉老师
摘要:11)哥德巴赫猜想: 一个大于等于4的偶数可以拆分为两个质数的和(用10e6内的数据测试一下):#include<iostream>using namespace std;#include<conio.h>#define M 1000000int p[M];bool is_prime(int n){ if(n<=1)return false; else for(int i=2;i*i<=n;i++) if(n%i==0)return false; return true;}int main(){ int n,i,j,k=0; for(i=2;...
阅读全文
posted @ 2012-04-20 13:25
龙杉老师
摘要:将一个整数n分解成x个正整数(a1+a2+a3+...+ax=n),使它们的乘积(a1*a2*a3*...*ax)最大。答案可能很大,输出对m取模后的结果。思路一:动态规划(DP)可以很容的思考出来动态转移方程用dp[i]代表当n=i的时候的最大乘积,于是:DP[i]=max(DP[i-j]*DP[j])动态规划的方法虽然可以解决该类问题,但是当n的值非常大的时候,dp数组都很难开的下,故不管是时间复杂度还是空间复杂度都高得惊人!于是需要新的思路。思路二:按照我们数学直觉,应该不难想到,分出来的这些a1,a2,a3…应该要相等才能让他们的积最大。/*小学的时候大家应该学过同
阅读全文
posted @ 2012-04-20 10:56
龙杉老师
摘要:对于一个B进制的数,只需要对其取以B的对数就可以得到他在B进制情况下的位数(取了对数之后可能为小数,所以还需要取整后再+1) N!的位数就是[lg(N!)]+1=[lg(1)+lg(2)+…+lg(N)]+1 =(int)ceil[(n*ln(n)-n+0.5*ln(2*n*π))/ln(10)]/*ceil是向上取整,[]符号为取整*/ 最后一个式子被称为斯特林公式例如:#include <iostream>using namespace std;#define pi 3.141592657#include<math.h>int main(){ int n;
阅读全文
posted @ 2012-04-19 23:55
龙杉老师
摘要:分解素因子(数论) Description 假设x是一个正整数,它的值不超过65535( 1< x <=65535 ),请编写一个程序,将x分解为若干个素数的乘积。 Input 输入的第一行含一个正整数k (1 <= k <= 65535 ),表示测试例的个数,后面紧接着k行,每行对应一个测试例,包含一个正整数x。Output 每个测试例对应一行输出,输出x的素数乘积表示式,式中的素数从小到大排列,两个素数之间用“*”表示乘法。 Sample Input 2 11 9828 Sample Output 11 2*2*3*3*3*7*13解:#inc
阅读全文
posted @ 2012-04-19 22:20
龙杉老师
摘要:Big Event in HDUProblem DescriptionNowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't know that Computer College had ever been split into Computer College and Software College in 2002.The splitting is absolutely a big event in HDU! At the same time
阅读全文
posted @ 2012-04-18 22:00
龙杉老师
摘要:Holding Bin-Laden Captive!We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of China!“Oh, God! How terrible! ”Don’t be so afraid, guys. Although he hides in a cave of Hang Zhou, he dares not to go out.
阅读全文
posted @ 2012-04-18 19:20
龙杉老师
摘要:Square CoinsProblem DescriptionPeople in Silverland use square coins. Not only they have square shapes but also their values are square numbers. Coins with values of all square numbers up to 289 (=17^2), i.e., 1-credit coins, 4-credit coins, 9-credit coins, ..., and 289-credit coins, are available i
阅读全文
posted @ 2012-04-18 15:53
龙杉老师
摘要:排列组合Problem Description有n种物品,并且知道每种物品的数量。要求从中选出m件物品的排列数。例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB","BA"两种。Input每组输入数据有两行,第一行是二个数n,m(1<=m,n<=10),表示物品数,第二行有n个数,分别表示这n件物品的数量。Output对应每组数据输出排列数。(任何运算不会超出2^31的范围)Sample Input2 2 1 1Sample Output2解:指数型母函数的应用#include<iostream>#includ
阅读全文
posted @ 2012-04-18 09:35
龙杉老师
摘要:母函数分为:普通型母函数,指数型母函数。普通型母函数主要是来求组合的方案数,而指数型母函数是求多重排列数。关于普通型母函数的讲解,以前写过:http://www.cnblogs.com/hsqdboke/archive/2012/04/17/2453677.html指数型母函数主要是关于排列组合方面的问题。分别看两个比较典型的问题对比:普通母函数问题:有红球两个,白球、黄球各一个,试求有多少种不同的组合方案。指数型母函数问题:假设有8个元素,其中a1重复3次,a2重复2次,a3重复3次。从中取r个组合,求其排列数。下面是指数型母函数的定义:对于上面的问题“假设有8个元素,其中a1重复3次,a2
阅读全文
posted @ 2012-04-17 20:58
龙杉老师

浙公网安备 33010602011771号