首页 > 技术文章 > 洛谷 P3414 SAC#1 - 组合数

jd1412 2020-03-17 15:19 原文

题目背景

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

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

题目描述

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

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

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

输入格式

输入仅包含一个整数n。

输出格式

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

说明/提示

对于20%的数据,n <= 20;

对于50%的数据,n <= 1000;

对于100%的数据,n <= 1 000 000 000 000 000 000 (10^18)

 

代码

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<math.h>
using namespace std;

long long ksm(long long n,long long m,long long k)
{
    if(m==0) return 1;
    
    long long z=ksm(n,m>>1,k);
    
    z=1ll*z*z%k;//不可与if的判断互换顺序,防止多乘一次n
    
    if(m%2==1)
    {
        z=1ll*z*n%k;
    }
    
    return z;
}

int main(void)
{
    long long n,ans_j,ans_o,ans_all;
    
    scanf("%lld",&n);
    
    ans_j=ksm(2,n-1,6662333);
    
    printf("%lld\n",ans_j);
    
    return 0;
}

 

 

 

复习:C(n,0)+C(n,1)+C(n,2)+C(n,3)+……+C(n,n)=2^n;…………①

C(n,0)-C(n,1)+C(n,2)-C(n,3)+……+(-1)^n*C(n,n)=0;…………②

证明:在(a+b)^n中,它的展开式的每一项为C(n,i)*a^(n-i+1)*b^(i-1) ,那么,当a=1,b=1时,即得:①式

           同理,当a=1,b=-1时,即得②式

则(①+②)/2,即可得到:C(n,0)+C(n,2)+C(n,6)+…………+C(n,2k)(k∈N*)= 2^(n-1)

即为本题的答案。

本题的幂运算不用多说,应该用快速幂进行简化。

 

 

 

 

推荐阅读