组合数学 - 组合数的个数

组合数的个数

输入一个n,然后输入n个一位数,求这n个数组成的不重复出现的整数的总和。



Mean:

analyse:

这样的数可以是1~n位,总共数的数目为:P(n,1)+p(n,2)+p(n,3)+.....+p(n,n)个。(其中p(n,m)表示从n个数中选m个数组成的排列的数目)。

若将这些数全部罗列出来再来求和,这不是一个好办法。其实我们可以将个位的和a1求出来,然后十位的和a2求出来,然后百位,然后千位......直到第n-1位。

那么最后的和就是:

sum=a1*1+a2*10^1+a3*10^2+a4*10^3.....an-1*10*n-2;

具体参看《组合数学.第三版》:P13

Time complexity:O(n^2)

Source code:

//Memory   Time
// 1347K   0MS
// by : Snarl_jsb
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<climits>
#include<cmath>
#define N 100010
#define LL long long
using namespace std;

LL n,sum,t;
LL a[5];

LL buff(LL s,LL e)
{
    LL res=1;
    for(LL i=s;i>=e;--i)
    {
        res*=i;
    }
    return res;
}

LL combination(LL n,LL m)
{
    LL t1=buff(n,n-m+1);
    return t1;
}

int main()
{
//    freopen("C:\\Users\\ASUS\\Desktop\\cin.txt","r",stdin);
//    freopen("C:\\Users\\ASUS\\Desktop\\cout.txt","w",stdout);
    while(~scanf("%I64d",&n))
    {
        sum=0;
        for(int i=1;i<=n;++i)
        {
            scanf("%I64d",&t);
            sum+=t;
        }
        LL tmp=1;
        a[0]=1;
        for(int i=1;i<n;i++)
        {
            a[i]=combination(n-1,i);
        }
        LL carry=1;
        LL ans=0;
        for(int i=0;i<n;++i)
        {
            LL tmp=0;
            for(int j=i;j<n;++j)
            {
                tmp+=a[j];
            }
            ans+=tmp*carry*sum;
            carry*=10;
        }
//        for(int i=0;i<n;i++)
//            cout<<a[i]<<endl;
        printf("%I64d\n",ans);
    }
    return 0;
}

  

时间: 2024-10-10 17:53:22

组合数学 - 组合数的个数的相关文章

hdu 1792 A New Change Problem(互质数之间最大不能组合数和不能组合数的个数)

题意:求互质的m和n的最大不能组合数和不能组合数的个数 思路:m和n的最大不能组合数为m*n-m-n,不能组合数的个数为(m-1)*(n-1)/2 推导: 先讨论最大不能组合数 因为gcd(m,n)=1,所以 0,n,2*n,3*n,...(m-1)*n(共m个数字)分别除以m,余数肯定不同,且为{0,1,2,3...m-1}中的某数 若存在非负数p,q使得pm+qn=x,x为可组合值,两边对m取余,则(q*n)%m==x%m,p*m>=0,所以只要x>q*n,x都能被组合出来.当q<m

数论 - 组合数学 --- 1的个数

1的个数 Mean: 输入一个n,计算小于10^n的正整数中含有1的数的个数. analyse: 这题是一道组合数学课后思考题. 基本思路:  组合数学乘法原则 + 容斥原理 n位数中,每位可选:{0,1,2,3,4,5,6,7,8,9},所以共有10^n种,其中要除掉每位都为0的情况,所以要减一. 其中每位上不选1的情况为:{0,2,3,4,5,6,7,8,9},所以共有9^n中,同样要除掉全部为0的情况. Time complexity:O(n) Source code: //Memory

Divisors_组合数因子个数

Description Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- or do you need any special reason for such a useful computation? Input The input consists of several instances. Each instance consists of a single li

uva live 4123 Glenbow Museum 数学递推

// uva live 4123 Glenbow Museum 数学递推 // // 题目大意: // // 对于一个边平行于坐标轴的多边形,我们可以用一个序列来描述,R和O,R表示 // 该顶点的角度为90度,O表示该定点的角度为270.给定序列的长度.问能由这些RO序 // 列组成的星型多边形(内部存在一个点可以看到所有的节点的多边形)的方法数有多少. // // 解题思路: // // 顶点数一定是序列的长度.n小于4无法组成多边形.n为奇数的时候也不行.设R的个数有 // x个,O的个数

东南大学第十三届程序设计竞赛初赛题解

问题 A: 天梯评分系统 题目描述 在一个下雨的日子,沈学姐和四个好基友约定无事一同打dota(dota是一个5对5的MOBA类游戏)因为想证明谁最NB,他们就全部注册新号去爬天梯了.天梯有一套完整的评分系统,它可以根据每位选手每局的数据进行评分,因为dota的英雄既有辅助又有ganker还有后期,所以不同的英雄的评分标准不一样.可惜那天天梯服务器维护,无法进行评分.于是,他们记录下每一局的数据,找你来帮忙,希望你能够帮他们仿照天梯编一个评分系统,以便于他们比较谁是真正的神牛. 已知对于每个账号

java中的排列组合

? 1 使用之前需要声明一个Combine的对象,调用startCombile方法,可返回想要的组合数或者个数,参数介绍很重要 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <br> public class Combine {     p

hdu-1792 A New Change Problem---数论&amp;剩余系

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1792 题目大意: 给定A和B,A和B互质,求最大不能组合数,和不能组合数的个数. 解题思路: 由于gcd(m,n)=1,所以 0,n,2*n,3*n,...(m-1)*n,对m作除,余数肯定不同,且为{0,1,2,3...m-1}中的某数 若存在非负数p,q使得pm+qn=x,则x为可组合值,两边对m取余,则(q*n)%m==x%m,p*m>=0,所以只要x比q*n大的数 都能被组合.由于q<m

OI数学知识清单

OI常用的数学知识总结 本文持续更新…… 总结一下OI中的玄学知识 先列个单子,(from秦神 数论 模意义下的基本运算和欧拉定理 筛素数和判定素数欧几里得算法及其扩展[finish] 数论函数和莫比乌斯反演 斐波那契数列及其性质 卡特兰数(在组合) 快速幂 离散对数和大步小步 二次剩余 原根 中国剩余定理 [email protected] Farey序列 勾股数生成公式 群论 置换的定义及运算 Burnside引理以及Pólya定理 基于置换群的贪心 组合数学 组合数及其求法 [finish

HDU 4349 组合数的奇数个数-杨辉三角&amp;Lucas定理

题意:给你一个n,求C (n,0),C (n,1),C (n,2)...C (n,n),奇数的个数. 分析: Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  modp同余 即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) 来看这一题,求奇数,那么我们