[洛谷刷题6]

P3414 SAC#1 - 组合数

https://www.luogu.com.cn/problem/P3414

题目描述

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

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

输入格式

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

输出格式

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

输入输出样例 #1

输入 #1

3

输出 #1

4

说明/提示

对于 20 % 20\% 20% 的数据, n ≤ 20 n \le 20 n20

对于 50 % 50\% 50% 的数据, n ≤ 1 0 3 n \le 10^{3} n103

对于 100 % 100\% 100% 的数据, n ≤ 1 0 18 n \le 10^{18} n1018

解题思路

二项式定理: ( 1 + 1 ) n = ∑ i = 0 n C n i (1+1)^n=\sum_{i=0}^{n}C_n^i (1+1)n=i=0nCni ( 1 − 1 ) n = ∑ i = 0 n ( − 1 ) n − i C n i (1-1)^n=\sum_{i=0}^{n}(-1)^{n-i}C_n^i (11)n=i=0n(1)niCni
相加得到: 2 n = 2 ∑ i ( i 为偶数, 0 ≤ i ≤ n ) C n i 2^n=2\sum_{i(i为偶数,0 \le i \le n)}C_n^i 2n=2i(i为偶数,0in)Cni
所以 a n s = 2 n − 1 m o d    6662333 ans = 2^{n-1}\mod 6662333 ans=2n1mod6662333,由于n的范围比较大,所以使用快速幂进行计算。

AC Code
#include 
using namespace std;

typedef long long ll;
const int mod = 6662333;

ll qkp(ll a, ll k) {
    ll ans = 1;
    while (k) {
        if (k & 1) ans *= a, ans %= mod;
        a *= a, a %= mod;
        k >>= 1;
    }
    return ans;
}

int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

    ll n;
    cin >> n;
    cout << qkp(2,n-1);
    return 0;
}

P1716 双调序列

https://www.luogu.com.cn/problem/P1716

题目描述

电脑组的童鞋们经常玩一些智力 PK 小游戏,某月某日,发源于小朋友又发明了一种新的序列:双调序列,所谓的双调呢主要是满足如下条件描述:

假定有 n n n n ≤ 1000 n \le 1000 n1000)个整数(都在 long int 范围内,即 − 2147483648 ∼ 2147483647 -2147483648 \sim 2147483647 21474836482147483647),双调序列的第一个数是 n n n 个整数中的最大数,第二个数是 n n n 个整数中的最小数,第三个数是 n n n 个数中的第二大数,第四个数是 n n n 个数中的第二小数……取过的数不能再取,依次类推,直到结束。

聪明的你听完描述就抿嘴笑了吧?那就请你用程序正确的帮他找出这 n n n 个数的双调序列。

输入格式

第一行为一个整数 n n n

接下来 n n n 行给出了题目中所述的 n n n 个整数,每行包含一个整数。

输出格式

n n n 行,每行为一个整数,是满足条件的双调序列

输入输出样例 #1

输入 #1

5
10
-1
3
3
-9

输出 #1

10
-9
3
-1
3

说明/提示

对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 1000 1 \le n \le 1000 1n1000

解题思路

先进行排序,排序后从两端开始输出

  • n为奇数,则需要输出中间值
  • n为偶数,则无需输出中间值
#include 
using namespace std;

typedef long long ll;

void solve(){
    int n;
    cin >> n;
    vector<ll> nums(n);
    for(int i=0;i<n;i++){
        cin >> nums[i];
    }
    if(n==1){
        cout << nums[0] << endl;
        return;
    }
    sort(nums.begin(),nums.end());
    int i = 0, j = n-1;
    while(i<j){
        cout << nums[j] << endl;
        cout << nums[i] << endl;
        i++,j--;
    }
    if(n%2){
        cout << nums[i];
    }
}

int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

    int t=1;
    //cin >> t;
    while(t--){
        solve();
    }
    return 0;
}

你可能感兴趣的:(c++,算法,刷题)