摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1356这是欧几里得的模板题。。。[扩展眼欧几里德]给定abd找到满足ax+by=d的令|x|+|y|最小|参考线性同余方程g=gcd(a,b),ax0+by0=gcd(a,b)|程的一组解:x=x0*d/g;y=y0*d/g;|方程的全部解:x..=x+b/g*ty..=y-a/g*t||x|+|y|=|x+b/g*t|+|y-a/g*t|(这里有绝对值,所以要想总体会小,那么里面的值要尽量小)|这个关于t的函数的最小值应该在|y-a/g*t|为零附近,即t=y*g/a|在y*g/a附近的两整数点里取t,再直 阅读全文
posted @ 2013-08-18 22:14 执着追求的IT小小鸟 阅读(276) 评论(0) 推荐(0) 编辑
摘要: 拓展欧几里得算法解二元一次不定方程:a*x+b*y=m;因为:gcd(a,b)| a , gcd(a,b)| b ;所以:gcd(a,b)| a*x , gcd(a,b) | b*y ==> gcd(a,b)|(a*x+b*y) ==>gcd(a,b)|m ;所以要求a*x+b*y=m,可以先求a*x+b*y=gcd(a,b).对于:a*x+b*y=gcd(a,b)1.当b==0时,gcd(a,b)=a,此时x=1,y=0;2.先求出 a*x+b*y=gcd(a,b) 的一组解。因为 a*x1+b*y1=gcd(a,b) b*x2+a%by2=gcd(b,a%b)且 gcd(a,b 阅读全文
posted @ 2013-08-18 22:02 执着追求的IT小小鸟 阅读(180) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2689给两个数,是个区间,求出区间内靠最近的相邻两个素数,和离最远的相邻的两个素数思路:先筛出50000以内的素数,然后再在给定的区间内以刚刚的素数为基底,筛出区间内的素数。筛的过程中算出区间左值是最小素数的几倍,然后然后不是整数倍,就往前加1(否则算出的数会不在这个区间里,没意义),然后这个整数倍乘以素数已经大于右边了,那就可以直接退出了。接下来直接按素数的叠加去筛筛完后先找第一个素数,因为在标记的时候把所有的数都标记成了1,所以找到的数有可能是1,但1不是素数,所以进入下一个,然后开始找答案。。。#include__int64 pri[ 阅读全文
posted @ 2013-08-18 19:00 执着追求的IT小小鸟 阅读(247) 评论(0) 推荐(0) 编辑