数论
chen_kkkk
这个作者很懒,什么都没留下…
展开
-
hdu/hdoj 1007 Quoit Design (最近点对问题)
原文地址点击打开链接 在二维平面上的n个点中,如何快速的找出最近的一对点,就是最近点对问题。 一种简单的想法是暴力枚举每两个点,记录最小距离,显然,时间复杂度为O(n^2)。 在这里介绍一种时间复杂度为O(nlognlogn)的算法。其实,这里用到了分治的思想。将所给平面上n个点的集合S分成两个子集S1和S2,每个子集中约有n/2个点。然后在每个子集中转载 2013-08-27 11:18:45 · 873 阅读 · 0 评论 -
hdu 1018 Big Number
数论里的题目 第一种做法: N!=1*2*3....*n 求位数我们一般用对一个数取对数就可以了 , log10(n!)=log10(1)+ log10(2) +log10(3)...+log10(n); 所以循环求和就可以了! 但是这里注意一点 结果要加1!因为这里计算出来的 log10(1)=0 ! 所以结果要加上这个误差 ‘1’原创 2013-08-27 12:27:39 · 634 阅读 · 0 评论 -
hdu/hdoj 1019 Least Common Multiple
题意就是求一个数列的最小公倍数,使用欧几里德算法 递归代码 #include #include using namespace std; __int64 data[1024]; //欧几里德算法求两个数的最大公约数 __int64 gcd(__int64 a, __int64 b) { if (b == 0) { return a;原创 2013-08-27 12:40:25 · 578 阅读 · 0 评论 -
hdu/hdoj 1005 Number Sequence
这个题有个数论的小知识; (A*B)%M=(A%M * B%M )%M 这个题网上说循环节为多少多少是因为对7取余之后两个数之间不同的组合只有7*7=49种,除去一开始的f(0)和f(1)等于1的两个值,所以只要保留48个数(合计50个值)就可以确保能知道循环序列了! #include int main() { int a,b,n,i,f[53];原创 2013-08-27 11:06:23 · 718 阅读 · 0 评论 -
hdu/hdoj 1058 Humble Numbers
这个题可能没用到什么数论的知识,但需要一点 对 素数分解的知识; 知道这个素数可以表示成 M=2^x * 3^y * 5^z * 7^k; 然后就是就是考虑数的大小排列问题; 在处理方式上参考了Tanky Woo大神的代码; #include #include using namespace std; __int64 humble[6000]; int原创 2013-08-28 21:53:19 · 622 阅读 · 0 评论 -
hdu/hdoj 1060 Leftmost Digit
这个题目有一个数学知识 对于十进制的任意一个数 n,都可以变成 n = a * 10^m(1 观察上面的式子不难发现,n 的首位仅由a的整数部分决定。 所以我们可以想办法先把a的值求出来,再对a的值取整,就是我们所要的结果。 首先,我们对式子两边同时取以10为底的对数,即 log10(n) = log10(a) + m。(m为整数,log10(a)为小数) 通过 log 函数,我们可以容原创 2013-08-28 22:32:02 · 612 阅读 · 0 评论 -
hdu/hdoj 1108 最小公倍数
#include #include using namespace std; int fun(int x,int y) { return y?fun(y,x%y):x; } int main() { int a,b; while (scanf("%d%d",&a,&b)!=EOF) { cout<<a/fun(a,b)*b<<endl;原创 2013-08-29 20:42:23 · 776 阅读 · 0 评论 -
hdu 1164 Eddy's research I
先用筛法筛出范围内的素数; 然后就水了 #include #include #include using namespace std; int prime[10000]; bool vis[65555]; int main() { memset(vis,0,sizeof(vis)); for(int i=2; i<=250; i++) {原创 2013-08-30 10:36:10 · 677 阅读 · 0 评论