HDU 数论专题
lulipeng_cpp
计算机迷
展开
-
HDU 1214 圆桌会议
这题纠结了很长时间,主要是题目看不太明白!刚开始一直在想暴利解决。让程序自动去调换,记录次数!汗颜!!!言归正传。这题就是在求一串数在每次只能对调相邻两位时,要得到其逆序最少要移动多少次。在直线上移动很简单,类似于冒泡排序的方法,一个数不断向上冒,直到最终位置。不难得到其需要移动的次数公式为n*(n-1)/2。其中n为总点数。那么在圆环上移动又会如何呢?应该会不一样这是我们直观的感原创 2012-05-28 14:48:49 · 4008 阅读 · 2 评论 -
HDU 2161 Primes 判断素数
贴这题并不是因为这题难。主要是我写过几题求素数的题。觉得这种判断数是否是素数的方法还比较好。就贴在这了。欢迎大家发表关于如何求素数的见解。 AC代码:31MS#includeusing namespace std;const int MAX=16001;bool prime[MAX];void initial(){ memset(prime,tr原创 2012-06-28 12:04:10 · 2562 阅读 · 2 评论 -
HDU 1492 The number of divisors(约数) about Humble Numbers
做该题大概要注意以下几方面:①每个自然数都可分解成质因数相乘的形式②数分为三类:质数是不为1,并且因数只为1和其本身的数。和数是不为1且不为质数的数。1既不是质数也非和数。③题目虽说输入的是64-bits signed integer,单输入一定没有负数。比如输入-2,其因数为-1,-2,1,2。-1、-2都不能由2、3、5、7的任意组合得到。 大概思路:把输入数据分解,也原创 2012-05-26 17:22:44 · 1633 阅读 · 1 评论 -
HDU 1163 Eddy's digital Roots
这题要求的是n^n的digital Roots,其中n找规律。该题的规律是这样的:无需直接求出n^n来再求其digital Roots。而是“平方一求”,然后用个循环一直计算完所有幂次为止。可见,这样处理之后最多计算5000即可。举个例子来说明下:9^9。先求9*9=81的digital Roots为9;然后用9*(9*9),再求其digital Roots为9;继续9*(9*9)..原创 2012-05-26 11:46:00 · 1030 阅读 · 0 评论 -
HDU2554 N对数的排列
这题可以这样来抽象:n对数,大小为1、2、3、...、n。现要求两个1之间有1个数,两个2之间有2个数,以此类推,两个n之间有n个数。并且,数的次序可以随意的。 解决之道:准备知识:①n对数,共2*n个数。所以要有2*n个位置来放置这2*n个数。②sum()表示求和运算。正式解决:①设k(k=1,2,..,n)放置的第一个位置为ak,第二个位置为bk。显然有bk原创 2012-06-13 22:26:51 · 3558 阅读 · 13 评论 -
HDU 2674 N! Again
这题要计算的是N!%2009,0思路:从1开始累乘,直到乘到因子为N为止,并且在相乘过程中,每相乘一次都mod2009,这样做和把所有1---N因子都乘完后再mod2009结果是一样的。原因在于每个数都能分为除以2009后的商部分和余数部分。用这个数乘以n,和用这个数除以2009的商乘以n以及余数乘以n,效果完全一样。商乘以n的部分任然是下一个数商部分;而余数乘以n的部分如果大于200原创 2012-05-31 15:10:01 · 1891 阅读 · 0 评论 -
HDU 2964 Prime Bases
解决这题思路就是从找到的合适的base开始,从大到小逐个计算其系数。为什么可以这样设计算法:1、题目给出n = a0 + a1*p0 + a2*p0*p1 + a3*p0*p1*p2 + ... ,说明对于输入的每一个n都可分解完,这是前提。2、代码中有函数deal()。它完成两部分功能,第一就是找到合适的base,这个base是不大于输入的n的,下一个base是要大于n的。因为大于n原创 2012-05-31 07:43:21 · 1669 阅读 · 2 评论 -
HDU 1576 A/B 扩展欧几里德算法
详细扩展欧几里德算法介绍,参见点击打开链接和点击打开链接解决该题的关键是:1、了解扩展欧几里德算法,可以运用其解出gcd(a,b)=ax1+by1中的x1、y1的值2、由题可得以下内容:n=A%9973,则n=A-A/9973*9973。又A/B=x,则A=Bx。所以Bx-A/9973*9973=n。即Bx-9973y=n。到这里我们可以发现:只要求出x的值,即可算出x%997原创 2012-05-29 14:07:35 · 5625 阅读 · 7 评论 -
HDU 1319 Prime Cuts
这题的难点在于:1、你得理解题意;2、你要处理繁琐的控制。从哪里开始输出,到哪里结束;每个数之前的空格,每行之后的空行等等题意:输入n、c。n为可能的素数的上限,输出素数个数则要根据1---n内素数的个数决定。若素数个数为偶数,则输出2*c个数;反之,输出2*c-1个数。并且,要从1---n中素数的中间向两边扩展,换句话也就是两头为输出的素数的个数要尽量相等,如不能做到,前面的要比后面的少原创 2012-05-29 08:47:25 · 1670 阅读 · 3 评论 -
HDU 1262 寻找素数对
该题比较简单。给出一个偶数,要求找到两个素数,其和为该偶数,并且两个素数相差尽量小。思路:在judge()函数中打出一张10000以内的素数表。prime[i]=true表示数i为素数,反之不是。然后再在main()中从接近输入n/2的数开始渐进寻找! AC代码:51MS#includeusing namespace std;const int MAXNUM=100原创 2012-05-28 15:29:31 · 3693 阅读 · 1 评论 -
HDU 1124 Factorial
解决该题要注意一下几个方面:1、任何一个自然数都可分解质因数。N!=1*2*3*4*5*6*...*N=2^a*3^b*5^c*7^d......=(2*5)^c*2^(a-c)*3^b*7^d......=10^c*2^(a-c)*3^b*7^d......2、两数相乘产生0,只会是2和5相乘。又由于在分解质因数时小的质数的幂次一定不小于大的质数的幂次大,所以a>=c。故解决该题转化成找原创 2012-05-27 10:29:33 · 1708 阅读 · 0 评论 -
HDU 1395 2^x mod n = 1
又是一道数学题分析:1、n==1或者n%2==0,都不会有这样的2的幂次存在。因为2^k(k=1、2、3...)为偶数,n为偶数时显然不存在;n==1则容易验证。2、n为奇数是则一定存在。n为奇数,则至少会存在一个偶数模取n等于1。2^k则会找到所有的偶数。3、2^k%n=(2^a*2^b)%n=((2^a%n)*(2^b%n))%n。(a+b=k) 代码:#i原创 2012-08-02 23:18:47 · 1786 阅读 · 0 评论