提交时间:2026-01-18 21:42:56

运行 ID: 83019

#include <iostream> #include <vector> using namespace std; int main() { int a, n, m, x; cin >> a >> n >> m >> x; // 特殊情况:x=1或x=2时,人数直接为a if (x == 1 || x == 2) { cout << a << endl; return 0; } // 步骤1:计算各站上车人数的规律(用数组存储) vector<int> up(n, 0); // up[i]表示第i站的上车人数 up[1] = a; // 第2站上车人数设为k(未知),后续通过m求解k // 先推导各站上车人数的表达式(基于k) vector<int> up_coeff(n, 0); // 存储各站上车人数中k的系数(常数项单独处理) up_coeff[1] = 0; // 第1站上车人数是a(无k) up_coeff[2] = 1; // 第2站上车人数是k(系数1) for (int i = 3; i < n; ++i) { // 第n站是终点站,不上车 up_coeff[i] = up_coeff[i-1] + up_coeff[i-2]; } // 步骤2:计算到第n-1站开出时的总人数(等于第n站下车人数m),推导k // 总人数 = a + 求和(第3站到第n-1站的上车人数 - 下车人数) // 下车人数规律:第i站下车人数 = 第i-1站上车人数(i>=3) // 化简后:总人数 = a + k * (系数和) int coeff_sum = 0; for (int i = 3; i < n; ++i) { // 第i站的净增人数 = 上车人数 - 下车人数 = (up[i] - up[i-1]) // up[i] = up_coeff[i] * k (i>=2),up[1]=a if (i == 3) { // 第3站下车人数是up[2] = k,上车人数是up[3] = up[1]+up[2] = a + k // 净增:(a + k) - k = a coeff_sum += 0; // 这部分a是常数项,k系数为0 } else { // 第i站上车人数:up_coeff[i]*k,下车人数:up_coeff[i-1]*k coeff_sum += (up_coeff[i] - up_coeff[i-1]); } } // 总人数m = a + a*(n==3?0:1) + k * coeff_sum (n>=4时,第3站贡献a) int constant = a; if (n > 3) { constant += a; // 第3站的净增a } int k = (m - constant) / coeff_sum; // 步骤3:计算第x站开出时的人数 int res = a; // 初始为第2站开出时的人数 if (x >= 3) { for (int i = 3; i <= x; ++i) { int up_i = 0; if (i == 3) { up_i = a + k; // 第3站上车人数=第1站+第2站 } else { up_i = up_coeff[i] * k; // 后续站上车人数仅含k } int down_i = 0; if (i == 3) { down_i = k; // 第3站下车人数=第2站上车人数 } else { down_i = up_coeff[i-1] * k; // 后续站下车人数=上一站上车人数 } res += (up_i - down_i); // 累加净增人数 } } cout << res << endl; return 0; }