本周刚开始学习数论,直接被虐爆。。
下面是几道基础题目的题解。
1。分数分解
这里需要一个转换:
1/x+1/y=1/n到xy=nx+ny到n*n=(x-n)(y-n);
转化到这一步,我们就知道了满足条件的方法数等于n*n的因子数(包括1和n*n)除以二.
代码:
#include<bits/stdc++.h>
using namespace std;
int n,ans=1;
int main()
{
scanf("%d",&n);
int k;
for(int i=2;i*i<=n;++i)
{
for(k=0;n%i==0;++k)
n/=i;
ans*=k*2+1;
}
if (n>1) ans*=3;
printf("%d",ans/2);
return 0;
}
这里求因子的方法不可以用暴力,要分解质因数,用乘法原理求因子数。
——————————————————
2.天才的约数和
这里有一个定理:某个数的约数倒数之和*这个数=这个数的约数和。
但是这题不能直接用这个公式,因为有些时候这个公式算出来的结果是不对的,所以要验证。
为什么不对呢。
例如,题目给出 18 9 5 那我们一算,这个数是10. 验证一下10的约数1,2,5,10,加起来刚好等于18,所以正确。但是如果题目给的是 36 18 5 算出来的也是10,但是10的约数和是1