导言:数学真让人头疼,好好的编程题怎么感觉搞得和数学题一样,当然,数学的逻辑思维对解决编程问题也有很大启发;我在此总结我这个蒻苟遇到的数论问题(常更新);
1,最大不能表示的数;
对于互质的两个数p,q,px+py 不能表示的最大数为pq-p-q.
证明过程:数论:px+py 不能表示的最大数为pq-p-q的证明 - PIPIBoss - 博客园
2,蚂蚁走路
一个简单的数学思想,碰头反向走转变为穿过对方进而继续走;
3,算术基本定理
应用的前三点常用,务必记住;
4,欧拉函数
定义:给定一个数n,1~n中与n互质的数的个数即为欧拉函数,记为
那怎么求呢?
根据算术基本定理,我们可以将1~n中的每个质因子以及它的倍数减去;
但是这样还不是答案,因为假如有的倍数既是pi的倍数,又是pj的倍数,那么它会被减去两次
需要加回来,但是后面还有更复杂的,既是pi,pj,又是pk的倍数,这样有很多,我们可以从
容斥原理的角度去思考;
所以最终欧拉函数的公式就是;
while的作用是求出来最本质的pi,pk,不要带次方的那种;
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
{
while(n%i==0)n/=i;
ans=ans/i*(i-1);
}
}
if(n>1)ans=ans/n*(n-1);
cout<<ans<<endl;
5,完全平方数,
如果n*x=m^2,完全平方数(2^2, 3^2, 4^2。。。)一个数A如果能组成完全平方数B,那么该完全平方数B一定能由A的质因子偶数次方形成;(算数基本定理:每个正整数都能够以唯一的方式表示成它的质因数的乘积);