数论
文章平均质量分 78
AndyZhang
一些当前好走的路会越走越窄,而一些当前艰难的路却会越走越宽广。
展开
-
uva10177
题目大意:给你二维三维四维表面都是方格,方格都是1×1的,给你n,代表n×n,3维就是n×n×n。。。。。让你求出有多少正方形,长方形(二维), 立方体,长方体(3维)。。。。。 算法分析:其实就是公式推导。以二维为例,你要先能求出矩形的个数(包含正方形),其实很好求,就是每条边任意取两条线,这两条线一定能组成一个矩形(当然也可能是正方形,正方形也是矩形)。所以矩形的个原创 2011-10-27 23:10:28 · 1188 阅读 · 2 评论 -
poj1740-楼教主所谓的男人八题之一
*题目大意:* 对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,* 第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余* 石子的一部分分给其它的某些堆。最后谁无子可取即输。*解题思路:* 1、先考虑1堆的时候,1堆当然是N点(必胜点),* 2、然后考虑2堆,细想一下可以发现,当2堆一样时,这个时候* 的目的就是要把对方给逼到只有2堆都是1的时候,就能必胜了。原创 2012-10-25 23:40:27 · 5281 阅读 · 0 评论 -
poj2728-最小比率生成树/0-1分数规划/二分/迭代
题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目是要求一棵最优比率生成树。 0-1规划: 概念有带权图G, 对于图中每条边e[i], 都有benifit[i](收入)和cost[i](花费), 我们要求的是一棵生成树T,原创 2012-11-13 00:34:19 · 4923 阅读 · 0 评论 -
poj1286-polya计数、burnside定理
组合数学题目就是一个手镯,用三种颜色图,可以旋转和翻转,求有多少方案。 建议先看看群、burnside定理,polya计数等知识给出公式; 代码:#include #include #include //最大公约数long long gcd(long long a, long long b){ long long c; if (a =原创 2012-12-19 22:33:52 · 2069 阅读 · 0 评论 -
n!后面有多少个0
很经典的一道数学题:求n!后面有多少个0。我的思路:从"那些数相乘可以得到10"这个角度,问题就变得比较的简单了。 首先考虑,如果N的阶乘为K和10的M次方的乘积,那么N!末尾就有M的0。如果将N的阶乘分解后,那么 N的阶乘可以分解为: 2的X次方,3的Y次方,4的5次Z方,.....的成绩。由于10 = 2 * 5,所以M只能和转载 2013-08-12 18:33:26 · 1232 阅读 · 0 评论 -
原根-快速求解一个数的原根
1.原根定义假设一个数g对于P来说是原根,那么g^i mod P的结果两两不同,且有 1简单来说,g^i mod p ≠ g^j mod p (p为素数)其中i≠j且i, j介於1至(p-1)之间则g为p的原根。 简单的来说,如果g是P的原根,那么g的(1...P-1)次幂mod P的结果一定互不相同。 那么简化一下:首先看一下欧拉定理:欧拉定理(也称费原创 2013-09-10 22:57:13 · 64324 阅读 · 2 评论 -
最大的最大公约数-数论
题目: 给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。Input第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000)第2 - N + 1行:每行1个数,对应输入的正整数.(1 Output输出两两之间最大公约数的最大值。I原创 2013-10-17 00:18:29 · 2596 阅读 · 0 评论 -
素数检测-Miller_Rabin算法-hoj1356-nod1186质数检测V2
一、 先介绍几个定理 费马小定理,二次探测定理参考:http://baike.baidu.com/,http://blog.csdn.net/iyundi/article/details/99553531、费马小定理著名的费马小定理为素数判定提供了一个有力的工具.费马小定理:如果p是一个素数,且(0则证明是容易的.2、二次探测定理如果p是素数,x是小于原创 2013-10-18 21:11:12 · 4786 阅读 · 0 评论 -
Minimum Modular单纯数学
题目描述N个不同的数a[1],a[2]...a[n],你可以从中去掉K个数,并且找到一个正整数M,使得剩下的N - K个数,Mod M的结果各不相同,求M的最小值。Input第1行:2个数N, K,中间用空格分隔,N表示元素的数量,K为可以移除的数的数量(1 <= N <= 5000, 0 <= K <= 4, 1 <= a[i] <= 1000000)。Ou原创 2013-11-14 22:45:42 · 1522 阅读 · 2 评论 -
poj3090-隐藏的好深,其实就是一个欧拉函数
看到这个题目简单分析了一下,最后才发现原来就是一个数论知识。首先,题目主要是求从0,0能看到的点的个数。先考虑只有1×1的时候,三个点,根据图明显看出,只需要计算下三角,结果=下三角的个数×2再加1(斜率为1的点)。那么我们只需要计算斜率从0到1之间的个数就行了,不包括1,包括0.结果设为sum,那么最终就是2*sum+1. 1×1只有一个斜率为0的2×2斜率有0,1/2(原创 2012-10-24 21:18:30 · 4222 阅读 · 2 评论 -
线性筛选素数。。。。线性哦
上一篇一道题目用到了筛选素数,不过是那个只需要求3400以内的,比较少,无所谓,关键是如果要求1000000以内的,再直接求就不行了,太慢了。下面给出两个自己用的模版,并解释解释,为何这样能够很快计算出素数。代码1,这个有点长,但是很好理解#include #include #include int prime[100000];bool s[1000010];void P原创 2012-06-09 11:26:09 · 4329 阅读 · 0 评论 -
poj3842-效率啊
这是一道算法选择不好会TLE的题目,同时这道题目涉及到的内容也非常丰富。至少我学到了一些知识。首先题目的内容很简单,就是最多给你7个数字,问你用着7个数字能组成多少个素数。 由于原来搞过线性筛选素数,于是就将9999999以内的素数保存下来,实际上这个过程大概需要半秒钟吧。然后枚举枚举每个素数,看看这个素数用到的数字是不是在给的7个里面,如果是就+1.代码很快敲完了,发现交上去TLE。原创 2012-06-09 11:01:19 · 1105 阅读 · 0 评论 -
uva10233
题意描述:图中都是边长1千米的的等边三角形。每个数字都是在这个等边三角形的外心上,求给出两个数字间的最短距离。(直接连线的长度,最短) 算法描述:从图中可以看出每行数字个数分别为1,3,5,7,9.。。。。然后我们就从等差数列求和公式得到求和公式f(n) = n^2.所以我们可以求出任意一个数字所在的行,和在这一行中的第几个数。也就是代码中的GetPos()函数。有了这些信原创 2011-10-23 15:30:40 · 713 阅读 · 0 评论 -
uva10182
题意描述:根据下面的图片你就可以看出来,就是根据下面右边图中的数字,求出对应左边图上的坐标。 算法分析:先看下面一幅图,然后进行分析。 1、首先我们可以看出中间是一个,第二圈是6个,第三圈是12个,这就是规律。其实就是一圈圈六边形,边长分别为1,2,3,4.。。。。这样我们通过n就可以知道当前这个点在第几圈。2、然后我们看x轴,也就是红色的那几条中的带黑色箭原创 2011-10-21 22:25:33 · 931 阅读 · 0 评论 -
uva10161
这道题目很简单,就是走一个路线,每走一步,就加1,最后得到一个方格,方格中放得时1到N的数据。求给你一个方格中的数据,请给出这个数据的位置,第一个数据位置是(1,1)。 首先我们可以看出每走一行一列刚好组成等差数列1,3,5,7,9.。。。也就是数字的个数。如1(1个),2,3,4(3个),5,6,7,8,9(5个0。。。。。又因为等差数列求和公式为Sn = n*n.也就是坐标为原创 2011-10-15 23:20:30 · 1016 阅读 · 0 评论 -
poj2954
还是pick定理,直接套用模板,具体请参考上两篇。 题目大意:给你一个三角形,求出三角形内部的整数点的个数。 代码:#include #include #include //#include #include using namespace std;struct POINT { int x,y;}point[110];in原创 2011-09-18 23:53:17 · 737 阅读 · 0 评论 -
poj1840--Eqs
题目大意:a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0所有的变量的范围是【-50,50】,都是整数,求有多少解,也就是多少种情况满足这个等式。算法分析: 直接循环肯定不行。100的5次方。会超时。考虑到hash。将等式变形a1x13+ a2x23=- a3x33 -a4x43+-a5x53 求出左边结果保存到hash表中,还好冲突不是太多,原创 2011-08-17 21:17:25 · 879 阅读 · 0 评论 -
poj3517
/* * poj3517.cpp * * Created on: 2010-8-18 * Author: friendy *//* * 对于约瑟夫问题,今天看到了一篇好帖子,是用数学方法处理的,感觉还不错的无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结原创 2010-08-18 21:07:00 · 1214 阅读 · 0 评论 -
poj-1001-1405-1503-高精度问题
三道高精度的问题用java解决:题目比较简单在这里不必说了。首先其实高精度这几道题目主要用到了BigInteger和BigDecimal数据类型。另外像add,sum,pow等函数。代码:1001:次幂import java.math.*;import java.io.*;import java.util.*;public class Main { /**原创 2010-01-03 17:42:00 · 929 阅读 · 0 评论 -
组合排列。。。初中的知识用到计算机上也这么麻烦。。
编程很多时候用到排列组合。。。组合可以搜索解决,也可以位运算轻松解决。比如有len个数字num[]保存,求出所有组合。。。那么就可以这样写for (int i = 1; i < (1 << len); ++ i)// get zuhe { int len1 = 0; for (int j = 0; j < len; ++ j) {原创 2012-06-09 11:56:08 · 2357 阅读 · 0 评论 -
直线分割圆-公式递推
题目:圆上有N个点,每个点和其他所有点之间都有直线相连。并且任意3线不共点。计算这些直线把圆分割所得的区域的数量K。 例如:N = 2,K = 2,N = 3,K = 4。由于结果可能会很大,输出K Mod (10^9 + 7)的结果。Input输入:1个数N。(2 Output输出数量 Mod 10^9 + 7Input 示例2Output 示例原创 2013-11-04 15:04:51 · 6191 阅读 · 0 评论