4 条题解

  • 0
    @ 2024-4-5 15:41:14
    #include <cstdio>
    
    int main() {
    	long long n;
    	long long res = 0;
    	scanf("%lld", &n);
    	
    	// A*B*C <= N
    	// => A*B <= N/C
    	// => C <= N/(A*B)
    	
    	// 因为 A <= B <= C
    	// A*A*A <= N (如果 A^3都 大于 n, 那么 A*B*C就更不用说, 肯定 > n, 所以是不合法的)
    	// A*B*B <= N
    	
    	for (long long a = 1; a * a * a <= n; ++a) { // 注意 遍历需要使用long long, 不然乘法会爆炸 
    		for (long long b = a; a * b * b <= n; ++b) {
    			long long tmp = n / (a * b) - b;
    			if (tmp >= 0)
    				res += tmp + 1; // 说明 1 ~ n/(a*b) 个 c 都是合法的
    								// - b 是为了保证 b < c
    								// + 1 是当 b == c 时候, b - c 为 0 但是计数需要+1 
    		}
    	}
    	
    	printf("%lld\n", res);
    	
    	return 0;
    }
    

    信息

    ID
    79
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    928
    已通过
    124
    上传者