Bạn được Yui0907 mời tham gia diễn đàn viết bài kiếm tiền VNO, bấm vào đây để đăng ký.
1 người đang xem
25 ❤︎ Bài viết: 28 Tìm chủ đề
3796 14
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[i] = a[i-1] + 1; else
                a[i] = 2;
            } else a[i] = (a[i-1] + a[i-1-k])%1000000;
        cout << a[n]%1000000;
    
    return 0;
}
 

Những người đang xem chủ đề này

Xu hướng nội dung

Back