NOI Trung Quốc 2026 - Pudding

Xem PDF



Dạng bài
Ngôn ngữ cho phép
C++
Điểm: 2600 (p) Thời gian: 10.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Bạn cần giải một bài tương tác được mô phỏng trong cùng tiến trình.

Độ ngon của mỗi chiếc bánh pudding là một số nguyên dương không quá \(4500\). Một chiếc bánh bí mật có độ ngon \(w\), trong đó \(1\le w\le m\).

Trong một lần hỏi, bạn chọn một dãy không rỗng \(a=[a_0,a_1,\ldots,a_{k-1}]\) gồm độ ngon của những chiếc bánh mua thêm. Thư viện chèn chiếc bánh bí mật vào dãy rồi sắp xếp thành

\[ b_0\le b_1\le\cdots\le b_k. \]

Giá trị trả về là

\[ \sum_{i=1}^{k}\gcd(b_{i-1},b_i). \]

Hãy xác định chính xác \(w\), đồng thời dùng càng ít lần hỏi và càng ít bánh mua thêm càng tốt.

Yêu cầu cài đặt

Bạn không được cài đặt hàm main, không được đọc standard input và không được ghi standard output. Submission phải include pudding.h và cài đặt:

C++
void init(int c, int t);
  • c là số hiệu test; c = 0 biểu thị dữ liệu mẫu.
  • t là số trường hợp bí mật trong test.
  • Thư viện gọi hàm đúng một lần khi chương trình bắt đầu.
C++
int find_tastiness(int c, int m);
  • c là số hiệu test và m là cận trên của \(w\).
  • Hàm phải trả về chính xác \(w\).
  • Thư viện gọi hàm đúng t lần. Mỗi lần gọi có một giá trị \(w\) đã được cố định riêng.

Trong find_tastiness, bạn có thể gọi:

C++
int query_tastiness(std::vector<int> a);
  • a phải không rỗng; mỗi phần tử phải thuộc \([1,4500]\).
  • Hàm trả về tổng gcd được định nghĩa ở trên.
  • Trong mỗi lần gọi find_tastiness, bạn được gọi query_tastiness không quá \(15\) lần.
  • Tổng độ dài của mọi vector a trong một lần gọi find_tastiness không quá \(3000\).

Khung khai báo:

C++
#include "pudding.h"

Thư viện tương tác không thích nghi: giá trị \(w\) đã được xác định trước mỗi lần gọi find_tastiness và không thay đổi theo các câu hỏi. Thí sinh không được tìm cách đọc trạng thái nội bộ của grader hoặc giao tiếp trực tiếp qua standard input/output.

Trong mọi trường hợp, phần thư viện của grader dùng không quá \(1.5\) giây và \(64\ \mathrm{MiB}\); lượng tài nguyên này không tính vào giới hạn dành cho submission.

Ràng buộc

  • \(1\le t\le3000\).
  • \(1\le m\le3000\).
  • \(1\le w\le m\).

Phân nhóm

Test Điểm \(t\) \(m\) Tính chất
\(1\) \(10\) \(35\) \(35\) Không
\(2\) \(20\) \(430\) \(3000\) A
\(3\) \(70\) \(3000\) \(3000\) Không

Tính chất A: \(w\) là số nguyên tố trong mọi trường hợp.

Cách tính điểm

Nếu có một giá trị trả về sai, một câu hỏi không hợp lệ hoặc vượt giới hạn, test tương ứng nhận \(0\) điểm.

Nếu mọi giá trị đều đúng, gọi \(Q\) là số câu hỏi lớn nhất trong một lần gọi find_tastiness, \(S\) là tổng số bánh mua thêm lớn nhất trong một lần gọi, và \(P\) là số điểm của test. Điểm nhận được là

\[ \left\lfloor f(Q)\,g(S)\,P\right\rfloor. \]

Trong đó

\[ f(Q)= \begin{cases} 1,&Q\le4,\\ 0.7^{Q-4},&5\le Q\le15, \end{cases} \]

\[ g(S)= \begin{cases} 1,&S\le35,\\ 1-\dfrac{S-35}{100},&36\le S\le75,\\ 0.2+\sqrt{\dfrac{235-S}{1000}},&76\le S\le235,\\ 0.2\cdot2^{-\frac{S-235}{1500}},&236\le S\le3000. \end{cases} \]

Ví dụ tương tác

Giả sử \(m=197\) và chiếc bánh bí mật có \(w=26\).

Lời gọi Kết quả
query_tastiness({2026, 7, 20}) \(5\)
query_tastiness({13, 52}) \(39\)
return 26 Chính xác

Ở câu hỏi đầu, dãy sau sắp xếp là \([7,20,26,2026]\), nên kết quả bằng

\[ \gcd(7,20)+\gcd(20,26)+\gcd(26,2026)=1+2+2=5. \]

Ở câu hỏi thứ hai, dãy là \([13,26,52]\) và kết quả bằng \(13+26=39\). Lần tìm này dùng \(Q=2\) câu hỏi và \(S=3+2=5\) bánh.

Nguồn

CCF NOI 2026 - Ngày 1, bài Pudding. Đề và dữ liệu chính thức được phát hành theo giấy phép CC BY-NC.

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: