原题解链接:https://ac.nowcoder.com/discuss/149984

其实本来所有的手办是WifeWife的中文翻译的

f(x)f(x)为整除xx(ab)(a * b)的有序对数

g(n)g(n)i=1nf(i)\sum_{i=1}^{n} f(i)

有了这个求和就简单了

abc=xa*b*c= x对于f(x)f(x)我们需要求的就是三元组(a,b,c)(a, b, c)的个数

那么g(x)g(x)求的就是(abc)x(a* b*c)\leq x的对数

我们可以先求对(abc)(a \leq b \leq c)的三元组计数,那么aa只要枚举到三次根下nn就好了,bb从剩下的na\sqrt{\frac{n}{a}}中枚举得到

这样保证了abca \leq b \leq c最后乘上全排列就ok了

对于a×a×aa \times a \times a它的全排列只有11

所以枚举的a,b,ca,b,c不能重复,对于有两个数相同的全排列只有33个,也要去重。

#include<bits/stdc++.h> 
using namespace std; 
#define LL long long 
using namespace std;
const int mod = 2333; 
LL n,ans,tmp;

int main() { 
        cin >> n; 
    	for(LL a = 1,v; a * a <= (v = n / a);++ a,++ ans)  
    	    for(LL b = a + 1;b * b <= v;++ b)  
    	        tmp += n / (a * b) - b; 
    	ans += tmp * 6;  
    	tmp = 0; 
    	for(LL a=1,v;(v = a * a) <= n;++ a) {  
    	    tmp += n / v;  
    	    if(a * a <= n / a) tmp --;   
    	}   
   	 	ans += tmp*3;  
   	 	cout << ans % mod; 
    return 0; 
}