πŸ’»

[λ°±μ€€] λ™μ κ³„νšλ²• - 1904. 01타일 λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] λ™μ κ³„νšλ²• - 1904. 01타일

λ˜νš¨λ‹ˆ 2020. 2. 12. 14:19

문제

μ§€μ›μ΄μ—κ²Œ 2진 μˆ˜μ—΄μ„ κ°€λ₯΄μ³ μ£ΌκΈ° μœ„ν•΄, 지원이 μ•„λ²„μ§€λŠ” κ·Έμ—κ²Œ 타일듀을 μ„ λ¬Όν•΄μ£Όμ…¨λ‹€. 그리고 이 각각의 타일듀은 0 λ˜λŠ” 1이 μ“°μ—¬ μžˆλŠ” λ‚±μž₯의 타일듀이닀.

μ–΄λŠ λ‚  짓ꢂ은 동주가 μ§€μ›μ΄μ˜ 곡뢀λ₯Ό λ°©ν•΄ν•˜κΈ° μœ„ν•΄ 0이 쓰여진 λ‚±μž₯의 타일듀을 λΆ™μ—¬μ„œ ν•œ 쌍으둜 이루어진 00 타일듀을 λ§Œλ“€μ—ˆλ‹€. κ²°κ΅­ ν˜„μž¬ 1 ν•˜λ‚˜λ§ŒμœΌλ‘œ 이루어진 타일 λ˜λŠ” 0타일을 두 개 뢙인 ν•œ 쌍의 00νƒ€μΌλ“€λ§Œμ΄ λ‚¨κ²Œ λ˜μ—ˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ μ§€μ›μ΄λŠ” νƒ€μΌλ‘œ 더 이상 크기가 N인 λͺ¨λ“  2진 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μ—†κ²Œ λ˜μ—ˆλ‹€. 예λ₯Ό λ“€μ–΄, N=1일 λ•Œ 1만 λ§Œλ“€ 수 있고, N=2일 λ•ŒλŠ” 00, 11을 λ§Œλ“€ 수 μžˆλ‹€. (01, 10은 λ§Œλ“€ 수 μ—†κ²Œ λ˜μ—ˆλ‹€.) λ˜ν•œ N=4일 λ•ŒλŠ” 0011, 0000, 1001, 1100, 1111 λ“± 총 5개의 2진 μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.

우리의 λͺ©ν‘œλŠ” N이 μ£Όμ–΄μ‘Œμ„ λ•Œ 지원이가 λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  κ°€μ§“μˆ˜λ₯Ό μ„ΈλŠ” 것이닀. 단 타일듀은 λ¬΄ν•œνžˆ λ§Žμ€ κ²ƒμœΌλ‘œ κ°€μ •ν•˜μž.

 

μž…λ ₯

첫 번째 쀄에 μžμ—°μˆ˜ N이 주어진닀.(N ≤ 1,000,000)

 

좜λ ₯

첫 번째 쀄에 지원이가 λ§Œλ“€ 수 μžˆλŠ” 길이가 N인 λͺ¨λ“  2진 μˆ˜μ—΄μ˜ 개수λ₯Ό 15746으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯1

4

 

예제 좜λ ₯1

5

 

생각

λͺ©ν‘œ : 지원이가 λ§Œλ“€ 수 μžˆλŠ” 타일 수λ₯Ό μ„Έμž. κ·œμΉ™μ°ΎκΈ°.

 

N=1 -> 1                                                                                  

(a,b) (0,1)                                                                           

N=2 -> 00, 11

(a,b) (1,0) (0,2)        

N=3 -> 001, 100, 111 

(a,b) (1,1) (0,3)     

N=4 -> 0000, 0011, 1001, 1100, 1111

(a,b) (2,0) (1,2) (0,4)     

N=5 -> 00001, 00100, 00111, 10011, 11001, 11111, 10000, 11100

(a,b) (2,1) (1,3) (0,5)   

 

f(1) = 1

f(2) = 1 + 1 = 2

f(3) = 2 + 1 = 3

f(4) = 1 + 3 + 1 = 5

f(5) = 3 + 4 + 1 = 8  

 

μˆ«μžμ—μ„œ 2λ₯Ό λ‚˜λˆ  => 00νƒ€μΌμ˜ μ΅œλŒ€ 갯수 => a

μˆ«μžμ—μ„œ 2둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€ => 1νƒ€μΌμ˜ μ΅œμ†Œ 갯수 => b

"같은 것을 ν¬ν•¨ν•˜λŠ” μˆœμ—΄"  f(n) = (a+b)! / a! * b!

 

ν•˜μ—¬ μ΄λŸ°μ‹μœΌλ‘œ

첫번째둜, 계산식을 μ°Ύμ•„λ‚Ό 수 μžˆμ—ˆκ³ , 

λ‘λ²ˆμ§Έλ‘œ, f(n) = f(n-1)+f(n-2) λΌλŠ” κ·œμΉ™λ„ 찾을 수 μžˆμ—ˆλ‹€. 

 

λ¨Όμ €, 첫번째 방법을 μ΄μš©ν•΄μ„œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ λ³΄μ•˜λ‹€.

더보기

#include <iostream>

using namespace std;
int n;
int a, b;
int cal(int a, int b);
int factorial(int num);

int cal(int a, int b){
    int result = 0;
    if(a == 0 || b == 0){
        return 1;
    }else{
        result = factorial(a+b)/factorial(a)/factorial(b);
        return result;
    }
}

int factorial(int num){
    int k;
    if(num == 0 || num == 1){
        return num;
    }else{
        k = num;
        for(int i=num-1; i>0; i--){
            k *= i;
        }
        return k;
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int cnt = 0;
    cin >> n;
    
    a = n/2;
    b = n%2;
    
    for(int i=a; i>=0; i--){
        //cout << cal(i, b) << " "<< i <<" "<< b <<"\n";
        cnt += cal(i,b);
        b += 2;
    }
    
    if(a==1){
        cout << 1;
    }else{
         cout << cnt%15746 << "\n";
    }
}

λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ–΄λ‹€. 

 

κ·Έλž˜μ„œ λ‘λ²ˆμ§Έ λ°©λ²•μœΌλ‘œ ν’€μ–΄λ³΄κ³ μž ν•˜μ˜€λ‹€. 

#include <iostream>

#define max 1000001

using namespace std;

int n;

long long arr[max];

int result=0;



int main(int argc, const char * argv[]) {

    // insert code here...

    ios_base::sync_with_stdio(false);

    cin.tie(0);

    

    cin >> n;

    

    arr[0] = 0;

    arr[1] = 1;

    arr[2] = 2;

    

    if(n==1){

        cout << 1;

    }else if(n==2){

        cout << 2;

    }else{

        for(int i=3; i<=n; i++){

            arr[i] = arr[i-1] + arr[i-2];

        }

        result = arr[n] % 15746;

        cout << result;

    }

    cout << "\n";

}

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ„£μ–΄λ΄€μ„λ•ŒλŠ” 닡이 μž˜λ‚˜μ™”λŠ”λ°, μ΄μƒν•˜κ²Œ μ œμΆœν•˜λ‹ˆ ν‹€λ Έλ‹€κ³  λ‚˜μ™”λ‹€. 

 

λͺ¨λ“ˆλŸ¬ 연산에 λŒ€ν•œ 이해가 λΆ€μ‘±ν–ˆλ˜ κ±° κ°™λ‹€. 

(a+b) mod m = ((a mod m) + (b mod m)) mod m (modλŠ” % μ—°μ‚°κ³Ό κ°™λ‹€. m:λ‚˜λˆ„λŠ” 수)이기 λ•Œλ¬Έμ— ν‹€λ Έλ‹€κ³  λ‚˜μ˜€λŠ” κ²ƒμ΄μ—ˆλ‹€. 즉, μœ„μ— μž‘μ„±ν•œ μ½”λ“œμ—μ„œ μˆ˜μ •ν•˜μžλ©΄ elseλ¬Έ μ•ˆμ˜ arr[i] = arr[i-1] % 15746 + arr[i-2] % 15746 으둜 κ³ μ³μ£Όκ±°λ‚˜ μ•„λž˜μ˜ μ½”λ“œ 처럼 μž‘μ„±ν•΄μ•Όν•œλ‹€. 

 

μ΅œμ’…μ μœΌλ‘œ μž‘μ„±ν•œ μ½”λ“œλ₯Ό 봀을 λ•ŒλŠ” μ–΄λ €μš΄ λ¬Έμ œλŠ” μ•„λ‹ˆμ—ˆμ§€λ§Œ 좔가적인 곡뢀λ₯Ό ν•œ λ¬Έμ œμ˜€λ‹€. μ΄μ‚°μˆ˜ν•™ κ³΅λΆ€ν•œμ§€κ°€ μ˜€λž˜λ˜μ–΄μ„œ 기얡이 κ°€λ¬Όκ°€λ¬Όν–ˆλŠ”λ° λͺ¨λ“ˆλŸ¬ 연산에 λŒ€ν•΄μ„œ ν•œλ²ˆ 더 정리해 λ³Ό κΈ°νšŒμ˜€λ‹€. 

더보기

β€»λͺ¨λ“ˆλŸ¬ μ—°μ‚°

μ–‘μ˜ μ •μˆ˜ m에 λŒ€ν•˜μ—¬

- a ≡ b (mod m) 이고 c ≡ d (mod m) 이면, a + c ≡ b + d (mod m) 이고 ac bd (mod m) 이닀.

 

- (a+b) mod m = ((a mod m) + (b mod m)) mod m

- a x b mod m = ((a mod m) x (b mod m)) mod m

+ ν•΄κ²°)

ν”Όλ³΄λ‚˜μΉ˜ 수의 경우, 46번째 μˆ˜κ°€ 2,981,215,073 이 λ˜μ–΄ int ν˜• λ²”μœ„(2,147,483,648 ~ 2,147,438,647) λ₯Ό μ΄ˆκ³Όν•œλ‹€. 

http://blog.naver.com/occidere/220787441430

 

[λ°±μ€€] 1904 - 01타일

문제 링크 : https://www.acmicpc.net/problem/1904이 λ¬Έμ œλŠ” λ…Έκ°€λ‹€λ₯Ό ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 있고, 쑰금만 더 ...

blog.naver.com

 

λ°˜μ‘ν˜•
Comments