P3414 SAC#1 - 组合数

GESP8 冲刺课堂页:先建模,再压缩状态,最后读代码。

一、先回答问题

结论

偶数项组合数之和在 n>=1 时等于 2^(n-1),用快速幂取模。

容易误入的路

按 n 枚举组合数,n 到 1e18 完全不可能。

二、核心观察

建模与压缩

利用二项式恒等式:总和 2^n,奇偶项和相等。

为什么不丢答案:把 (1+1)^n 与 (1-1)^n 相加,奇数项抵消,只剩偶数项。

n 指数 n-1 mod

三、互动演示

步骤1
关键状态 A-
关键状态 B-
答案/目标-
复杂度看表
课堂动作手推

四、自己选答案

问题 1

n=0 的答案是什么?

问题 2

为什么要快速幂?

五、手推结果

公式结果
所有项2^n
交替和0
偶数项2^(n-1)

课堂要求:每题先说清对象、关系、保留的信息、压缩掉的信息,再写代码。

六、C++14 参考代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll MOD = 6662333;

// 快速幂计算 (base^exp) % mod
ll power(ll base, ll exp) {
    ll res = 1;
    base %= MOD;
    while (exp > 0) {
        if (exp % 2 == 1) res = (res * base) % MOD;
        base = (base * base) % MOD;
        exp /= 2;
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    ll n;
    if (!(cin >> n)) return 0;

    if (n == 0) {
        cout << 1 << endl;
    } else {
        // 偶数项之和为 2^(n-1)
        cout << power(2, n - 1) << endl;
    }

    return 0;
}