当然,我们还要注意 N 和 M 的值,如果因数超出了相应的范围,我们就不能计算在内了。因此,这道题就变成:找到 k 在分别在 1 \sim N 和 1 \sim M 范围内的因数的个数 sn 和 sm,此时 sn\times sm 即为 k 符合要求的位置个数。最后分别求出 1 \sim K 的符合要求的个数再按要求乘上系数再累加求和即可。
复杂度分析
如果采用枚举法分别枚举 1 \sim K 在 1 \sim N 和 1 \sim M 中的因子个数的话,时间复杂度肯定会超,那我们换一种思路来实现该部分的操作。
此时 sn[k] 表示在题目中二维数组的行中,k 的因数的个数。然后用同样的方法求出在二维数组的列中 sm[1] \sim sm[K] 的值,并在最终的计算中将两个数组的值以及系数 k 相乘然后累加求和即可得到最终的结果。另外,别忘了开 long long,以及在计算最后的答案时,小心由于循环中定义的局部变量类型为 int 而导致的最终结果的错误!
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int sn[1000005],sm[1000005];
long long ans=0;
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=i;j<=k;j=j+i)
sn[j]++;
for(int i=1;i<=m;i++)
for(int j=i;j<=k;j=j+i)
sm[j]++;
for(int i=1;i<=k;i++)
ans+=(long long)i*sn[i]*sm[i];
cout<<ans;
return 0;
}