canuc80k2927·28/50

Xâu Ngắn Nhất Nhiều Dãy Con

Nộp bài trên LQDOJ

Bài 29 · Constructive Algorithms

Một dãy con của xâu được tạo bằng cách chọn một số vị trí theo thứ tự tăng dần, không nhất thiết liên tiếp, rồi ghép các ký tự ở những vị trí đó.

Cho số nguyên . Hãy tạo một xâu chỉ gồm chữ cái tiếng Anh viết thường, sao cho có ít nhất cách chọn đúng vị trí để các ký tự được chọn lần lượt là

c, o, d, e, f, o, r, c, e, s.

Trong tất cả các xâu thỏa điều kiện, xâu được in phải có độ dài nhỏ nhất. Nếu có nhiều đáp án ngắn nhất, có thể in bất kỳ đáp án nào.

Input

  • Input chỉ gồm một số nguyên .

Output

  • In một xâu chữ thường ngắn nhất chứa ít nhất dãy con bằng codeforces.

Constraints

  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

12

Output

ccooddeeforces

Giải thích: Bốn nhóm ký tự đầu có hai lựa chọn và sáu nhóm còn lại có một lựa chọn, nên xâu có dãy con cần tìm. Với độ dài , tích lớn nhất chỉ là , vì vậy độ dài là tối ưu.

Lời giải tóm tắt
  • Ý tưởng: Xét xâu có dạng mười block theo đúng thứ tự của từ mẫu. Gọi số lần lặp của các ký tự là cnt[0],...,cnt[9], tất cả ban đầu bằng 1. Số dãy con codeforces khi đó là tích
  • Ý tưởng: P = cnt[0]·cnt[1]·...·cnt[9].
  • Ý tưởng: Với tổng các cnt cố định, tích lớn nhất đạt được khi hai số đếm bất kỳ chênh nhau không quá 1: nếu x≥y+2, chuyển một đơn vị từ x sang y làm tích tăng vì (x-1)(y+1)-xy=x-y-1>0.
  • Ý tưởng: Do đó, bắt đầu với mười số 1 và lần lượt tăng cnt[0],cnt[1],...,cnt[9] theo vòng tròn cho tới khi tích đạt ít nhất k. Sau mỗi lần tăng, bộ số đếm vẫn cân bằng, tức có tích lớn nhất trong mọi xâu có cùng độ dài. Lần dừng đầu tiên vì thế cho độ dài tối thiểu.
  • Ý tưởng: Cuối cùng in từng ký tự của codeforces đúng số lần theo cnt. Độ phức tạp là O(L), với L là độ dài output, và dùng O(1) bộ nhớ phụ.