Algorithm/Baekjoon

[Algorithm/Baekjoon] 1์˜ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ - 9527 (G2/JAVA)

dpdms2148 2023. 6. 14. 23:18
728x90

๐Ÿ“‘๋ฌธ์ œ๋งํฌ

9527๋ฒˆ: 1์˜ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

๐Ÿ’ป์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static long[] dp = new long[55];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        long A = Long.parseLong(st.nextToken());
        long B = Long.parseLong(st.nextToken());

        //dp[n] = dp[n-1] ร— 2 + 2โฟ์„ ์ด์šฉํ•˜์—ฌ ๋ˆ„์ ํ•ฉ ์ €์žฅ
        dp[0] = 1;
        for (int i = 1; i < 55; i++) {
            dp[i] = (dp[i - 1] << 1) + (1L << i);
        }

        System.out.println(getCount(B) - getCount(A - 1));
    }

    //1~N ์ •์ˆ˜์— ๋Œ€ํ•œ 1์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
    private static long getCount(long n) {
        long count = n & 1;
        //N๋ณด๋‹ค ์ž‘์€ 2โฟ์˜ n์˜ ์ตœ๋Œ€๊ฐ’
        int size = (int) (Math.log(n) / Math.log(2));
        for (int i = size; i > 0; i--) {
            //DP[i-1] : 000 ~ 111 ๊ฐœ์ˆ˜
            //N - (1L << i) : ์ง€์ •๋œ 1์ด ๋ฐ˜๋ณต ์‚ฌ์šฉ๋  ๊ฐœ์ˆ˜ 
            // + 1 : 1000... 
            if((n & (1L << i))!=0L){
                count += dp[i - 1] + (n - (1L << i)) + 1;
                n -= (1L << i);
            }

        }
        return count;
    }
}
//์ฐธ๊ณ  : https://tussle.tistory.com/1022

โณํšŒ๊ณ 

  • ์ˆ˜ํ•™์ ์œผ๋กœ ํ’€์–ด๋‚ธ๋‹ค๋Š” ๋А๋‚Œ๊นŒ์ง€๋งŒ ์žก๊ณ  ์ ํ™”์‹ ๋„์ถœ๊นŒ์ง„ ์‹คํŒจํ–ˆ๋‹ค.
  • ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐพ์•„๋ณด๋ฉฐ ํ’€์ด๋ฅผ ํ–ˆ๋Š”๋ฐ๋„ ์–ด๋ ต๋‹ค.
728x90