Giải bài ntucoder SABO - Sắp bò

Thảo luận trong 'Khác' bắt đầu bởi nguyen minh duc, 7 Tháng bảy 2023.

  1. nguyen minh duc

    Bài viết:
    28
    Link bài:

    Thuật toán:

    • Đầu tiên, khi trong hàng có 0 con bò (n = 0), ta có 1 cách xếp.
    • Thống kê số cách xếp i con bò thành hàng (i < n), với trường hợp i ≤ k tức trong hàng chỉ có thể có nhiều nhất 1 con bò đực, số cách sắp chỉ có thể có i con bò trắng và i trường hợp trong đó có 1 con bò đực trong hàng.
    • Trường hợp lớn hơn (Đa phần) thì số cách sắp i con bò thành hàng sẽ bao gồm 2 trường hợp:
      • Trường hợp 1, con bò thứ i là bò cái: Số cách xếp i con bò sẽ bằng số cách xếp i-1 con bò (Vì thêm 1 con bò cái vào cuối hàng không ảnh hưởng gì đến số cách sắp xếp nếu con bò đó không có trong hàng.
      • Trường hợp 2, con bò thứ i là bò đức: Số cách xếp i con bò sẽ bằng số cách xếp i-1-k con bò vì chắc chắn nếu con bò thứ i là bò đen thì trong bán kính i-k đến i sẽ không có bò đực nào nữa. ⇒ Đồng nghĩa với việc khoảng đó không thay đổi ⇒ Dẫn đến việc ta chỉ cần đếm số cách xếp của i-1-k con bò còn lại.
        • Công thức cho trường hợp này a= (a[i-1] +a[i-1-k] )
    Code:

    Mã:
    #include <bits/stdc++.h>
    using namespace std;
    
    long long int a[1007], n, k;
    
    int main(){
        ios_base::sync_with_stdio(0);
        cin.tie(0); cout.tie(0);
        //freopen("sabo.inp", "r", stdin);
        //freopen("sabo.out", "w", stdout);
        cin >> n >> k;
        a[0] = 1;
            for (int i = 1; i <= n; i++)
                if (i <= k){
                    if (k > 1)
                    a = a[i-1] + 1; else
                    a = 2;
                } else a = (a[i-1] + a[i-1-k])%1000000;
            cout << a[n]%1000000;
        
        return 0;
    }
     
Trả lời qua Facebook
Đang tải...