原题解链接:https://ac.nowcoder.com/discuss/149984
其实本来所有的手办是的中文翻译的
设为整除的的有序对数
为
有了这个求和就简单了
另对于我们需要求的就是三元组的个数
那么求的就是的对数
我们可以先求对的三元组计数,那么只要枚举到三次根下就好了,从剩下的中枚举得到
这样保证了最后乘上全排列就ok了
对于它的全排列只有个
所以枚举的不能重复,对于有两个数相同的全排列只有个,也要去重。
#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; 
} 

京公网安备 11010502036488号