数论题4例:
Uva12169不爽的裁判:
这道题是一道比较好的数论题罢。额,一开始真心没思路。很明显最开始的想法就是暴搜a和b,然后的话发现会超,于是看看能不能优化咯。发现暴搜a之后可以通过联立关系式求出b然后基本就Ok,主要是要公式推导一下。一开始真笨啊。。。想到中国剩余定理去了,推导其实不难,就是带入则个就好了。
X2=(ax1+b)%mod,x3=(ax2+b)%mod
则x3=(a(ax1+b)+b)%mod=(a*a*x1+a*b+b)%mod=(a*a*x1+b*(a+1))%mod
然后就变式成x3+k*mod=a*a*x1+b*(a+1)->b*(a+1)-k*mod=x3-a*a*x1扩展欧几里得一下就可以了
Uva10375:
比较裸的一道唯一分解定理,直接构造素数表,一个个质因数分解,化乘除为加减就可以了。注意最后一步要边乘边除否则会爆盏。
Uva最小公倍数的最小和
这题要稍微转化一下。最小公倍数为n,要分解成好几个数使得和最小。首先考虑
a>=b+a/b(b|a)这里证明一下,首先明显1是不管的,则每一个数都大于等于二,意味a/b<=a/2而b因为是a的因数(不等于a),所以b<=sqrt(a)<=a/2所以有上式
考虑到此,分就一定比不分解更好。怎么样才能分得最“彻底”而满足最小公倍数呢,那么不难证明,如果设n=a*d(a、d互质),那么n可以直接分解成a和d,而假设a=b*c(b,c≠1),b、c不互质,即gcd(b,c)!=1,则a=b*c/gcd(b,c)再令b’=b/gcd,c’=c/gcd,此时b’、c’、gcd分别互质,则a=b’*c’*gcd;此时a就被分解得更多了,所以一定更优,对于d也一样,分解出之后再次分解,然后最后得出的所有数都互质,就可以了。
额。。。证明的比较麻烦,然后就直接使用唯一分解定理了。
还有,细节比较多,首先质数要+1,其次是一个数的n次方的数的数要记得它只会被分解成一个数,所以要特判,还要+1,其他就没啥了。
Uva12716:
这题一开始我是从类比扩展欧几里得的角度去考虑的,然而失败了。。。。这也是我最近做题不好的一点,老是只会使用一种方法。。。
然后捏,先来分析题目,题目输入数据只有一个n,而且输出也只有一个,而且n还小,所以的话,肯定可以交表!
既然可以交表,那么就要构造表,我当时真是傻,直接打几组数据找个规律不就行了。。。这也是竞赛的时候的一种方法吧。。
至于正解,真心想不到,作为一个数论蒟蒻,我还是乖乖打表看数据吧。。。下面贴证明,表在意。。
A-B >= A%B >= gcd(A, B)
A xor B >= A-B
所以说A xor B >= A-B >= gcd(A, B),然后就可以推出
A xor B = A - B = gcd(A, B) => A xor B = A - B && A - B = gcd(A, B)
设 C = gcd(A, B),那么我们可以枚举C和A,通过A-C求出B,再验证A xor B 是否等于C即可
这里的枚举是仿照筛素数的方法,对于每一个A,我们求出一共有多少C满足条件,记为ans[A],那么最后只需要累加一下就可以。
好嘞搞定下面是数论题目总结
总结:
数论题解题的一般方法:
① 先对题目进行分析和理解,进行一定的转化后转化成自己已知的算法,目前已知的算法有:(当然是我这只蒟蒻懂的啦)
(1) 唯一分解定理
(2) 素数筛选法
(3) 欧几里得
(4) 扩展欧几里得
(5) 中国剩余定理
② 适当结合一些暴搜的手段,有时候其实只是插在题目之中做为一个小小优化而已,让程序跑得快一些。
③ 注意考虑问题逻辑的全面性,注意有没有特解,特殊情况
④ 数学功底。。(最没办法的。。慢慢练吧)
就到这了。膜拜下各位大神咯,加油