今天一下午都在研究约数的各种性质。。。 求约数个数的和可以用线性筛的方式,线性求解的方式,这应该是最快的 [数论]线性筛——约数个数与约数和 除此之外还有代码更简便方法: 对应的例题
方法一:
#include <iostream>
using namespace std
;
int OneToNumGcdCount(int num
) {
int ans
= 0;
for (int i
= 1; i
<= num
; i
++) {
ans
+= num
/ i
;
}
return ans
;
}
int main()
{
int t1
, t2
, t
;
cin
>> t1
>> t2
;
t
= OneToNumGcdCount(t2
)- OneToNumGcdCount(t1
-1);
cout
<< t
;
return 0;
}
方法二:
#include<bits/stdc++.h>
using namespace std
;
typedef long long ll
;
ll n
,m
;
ll
get(ll n
){
long long ans
=0, t
=sqrt((double)(n
));
for(int i
=1; i
<=t
; i
++)
ans
+= n
/i
;
ans
= ans
*2-t
*t
;
return ans
;
}
int main(){
scanf("%lld%lld",&n
,&m
);
cout
<<get(m
)-get(n
-1)<<endl
;
return 0;
}
代码二的时间复杂度更低,个人感觉代码二应该是代码一的优化版本