题解 P3414 【SAC#1 – 组合数】

Xial 发布于 2019-09-16 0 次阅读


SAC#1 - 组合数

题目背景

本题由世界上最蒟蒻最辣鸡最撒比的 SOL 提供。

寂月城网站是完美信息教室的官网。地址:http://191.101.11.174/mgzd

题目描述

辣鸡蒟蒻 SOL 是一个傻逼,他居然觉得数很萌!

今天他萌上了组合数,现在他很想知道 $\sum \rm{C}$${n}^{i}$ 是多少。其中 $\rm{C}$ 是组合数(即 $\rm{C}$${n}^{i}$ 表示 $n$ 个物品无顺序选取 $i$ 个的方案数),$i$ 取从 $0$ 到 $n$ 的所有偶数。

由于答案可能很大,请输出答案对 $6662333$ 的余数。

输入格式

输入仅包含一个整数 $n$。

输出格式

输出一个整数,即为答案。

样例 #1

样例输入 #1

3

样例输出 #1

4

提示

对于 $20%$ 的数据,$n \le 20$;

对于 $50%$ 的数据,$n \le 10^{3}$;

对于 $100%$ 的数据,$n \le 10^{18}$。

数论就要有数论的做法嘛

首先我们都知道组合数是与杨辉三角息息相关的,那么……

先看看杨辉三角吧:

![1659367282111](./image/题解 P3414 【SAC#1 - 组合数】/1659367282111.png)

其实第 $n$ 行的第 $m$ 个数就是 $C(n-1,m-1)$ 的值

那么我们还知道杨辉三角第 $n$ 行的值是 $2^{n-1}$

我们还可以证明得当 $n\geqslant2$ 时每一行奇数项的和与偶数项的和是相等的

于是……

其实偶数项的和就是每一行的和的一半,也就是 $2^{n-2}$

所以代码就很好写咯 [一个简单的快速幂就可以啦]

#include <cmath>
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll c, ans = 1;
inline int quick_pow(ll b, ll k) {
    ll a = b;
    while (k > 0) {
        if (k & 1) {
            ans *= a;
            ans
        }
        a *= a;
        a
        k = k >> 1;
    }
    ans
    return ans;
}
int main() {
    ll a, b;
    scanf("
    c = 6662333;
    quick_pow(2, a - 1);
    printf("
    return 0;
}
最后更新于 2022-09-16