- 论坛徽章:
- 1
|
我把第一种方法进行优化,可以得到O(n)时间、O(1)空间的算法
- int i_log(long long m, int n)
- {
- int i;
- for(i=0; m >= n; i++) m /= n;
- return i;
- }
- long long i_pow(int m, int n)
- {
- long long val;
- for(val = 1L; n > 0; n--) val *= m;
- return val;
- }
- long long get_val(int i, int j, int k)
- {
- int x;
- int val = 1;
- for(x = 0; x < i; x++) val *= 2;
- for(x = 0; x < j; x++) val *= 3;
- for(x = 0; x < k; x++) val *= 5;
- return val;
- }
- int count_n(long long m)
- {
- int i, j, n = 0, x;
- for(i=0; i<=i_log(m, 2); i++) {
- x = i_log(m/i_pow(2,i), 3);
- for(j=0; j<=x; j++)
- n += i_log(m/i_pow(2,i)/i_pow(3,j), 5) + 1;
- }
- return n;
- }
- long long get_max_c(long long m)
- {
- int i, j, n = 0, x;
- long long c = 0, t;
- for(i=0; i<=i_log(m, 2); i++) {
- x = i_log(m/i_pow(2,i), 3);
- for(j=0; j<=x; j++) {
- t = get_val(i, j, i_log(m/i_pow(2,i)/i_pow(3,j), 5));
- if( t > c) c = t;
- }
- }
- return c;
- }
- long long get_c(long long max, int n)
- {
- int max_n = count_n(max), tmp;
- long long min = 0, mid;
- while(max_n > n) {
- mid = (max + min) / 2;
- if((tmp = count_n(mid)) < n)
- min = mid;
- else {
- max = mid;
- max_n = tmp;
- }
- }
- return get_max_c(max);
- }
- int main()
- {
- printf("%lld\n", get_c(4650268755LL, 1500));
- }
复制代码
这个的好处是没用到数组,空间占用小 |
|