精华内容
下载资源
问答
  • 集合划分问题

    2019-04-09 09:27:23
    非空子集组成的集合。 解题的思路,一种是分治的思想。把n个元素编号,对于最后那个n号元素,两种情况: 一种是独立组成一个集合,另一种是和别的元素混在一起。 对于第一种情况,等价于把前n-1个元素分成m-1份,...

    给定正整数 n 和 m,计算出 n 个元素的集合{1,2, , n }可以划分为多少个不同的由 m 个
    非空子集组成的集合。
    解题的思路,一种是分治的思想。把n个元素编号,对于最后那个n号元素,有两种情况:
    一种是独立组成一个集合,另一种是和别的元素混在一起。
    对于第一种情况,等价于把前n-1个元素分成m-1份,然后n号元素单独放。
    对于第二种情况,等价于把前n-1个元素分成m份,然后把n号元素放入这m个集合中的一个(有m种放法)
    总数就是
    F(n,m) =F(n-1,m-1) + m * F(n-1,m)
    递归
    m=n的情况,结果很明显是1。
    m=1的情况,结果也是1。
    n=1的情况,m只能等于1, 结果也是1
    代码:

    #include<stdio.h>
    int fun(int n,int m)
    {
    	if(m>n||m==0) return 0;
    	else if(m==n||n==1||m==1)
    	return 1;
    	else return fun(n-1,m-1)+m*fun(n-1,m);
    }
    int main()
    {
    	int n;
    	int m;
    	scanf("%d%d",&n,&m);
    	printf("%d\n",fun(n,m));
    	return 0;
    }
    
    展开全文
  • 动态规划集合划分

    2016-12-08 23:13:34
    1. 问题描述:n个元素的集合{1,2,..., n }可以划分为若干个非空子集。例如,当n = 4 时,集合{1,2,3,4}可以划分为15 个不同的非空子集如下:{{1},{2},{3},{4}}, {{1,2},{3},{4}},{{1,3},{2},{4}}, {...
  • 百练-集合的划分

    2018-05-12 20:59:16
    一个集A(本题中的集合均不含重复元素)分成若干个非空子集,使得A中每个元素属于且仅属于一个子集,那么这些子集构成的集合称为A的一个划分。比如A={1,2,3},那么{ {1},{2 ,3} }以及{ {1},{2},{3} } 都是A的...

    描述

    把一个集A(本题中的集合均不含重复元素)分成若干个非空子集,使得A中每个元素属于且仅属于一个子集,那么这些子集构成的集合称为A的一个划分。比如A={1,2,3},那么{ {1},{2 ,3} }以及{ {1},{2},{3} } 都是A的划分。现在给定一个整数n,我们希望知道包含n个元素的集合有多少不同的划分。当n=3的时候,仍然考虑集合{1,2,3},它的所有划分如下

    { {1} , {2} , {3} }
    { {1 , 2} , {3} }
    { {1 , 3} , {2} }
    { {1} , {2 , 3} } 
    { {1 , 2 , 3} }
    只有5种,但随n的增加,划分方法的个数会以指数速度增加。比如n=4的时候,就有15种方法,考虑集合{1,2,3,4},划分方式如下
    { {1},{2},{3},{4}}
    {{1},{2},{3,4}}
    {{1,2},{3},{4}}
    {{1,3},{2},{4}}
    {{1,4},{2},{3}}
    {{1},{2,3},{4}}
    {{1},{3},{2,4}}
    {{1,2},{3,4}}
    {{1,3},{2,4}}
    {{1,4},{2,3}}
    {{1},{2,3,4}}
    {{2},{1,3,4}}
    {{3},{1,2,4}}
    {{4},{1,2,3}}
    {{1,2,3,4}}
    当n>15的时候,划分方法数将超过32位整数所能表示的范围,我们希望你的程序能计算出n<=15的时候,包含n个元素的集合的划分方法的个数输入一个整数n(0<=n<=15,n=0的时候认为有一种划分方法)输出包含n个不同元素的集合的划分方法的个数
    样例输入

    3
    15

    样例输出

    5
    1382958545

    提示

    递归公式,

    设n个元素的集合可以划分为F(n,m)个不同的由m个非空子集组成的集合。
    F(n,m) = 1, where n=0, n=m, n=1, or m=1
    F(n,m) = 0, where n<m
    否则
    F(n,m)=F(n-1,m-1)+m*F(n-1,m)

    例如:
    考虑3个元素的集合,可划分为
    ① 1个子集的集合:{{1,2,3}}
    ② 2个子集的集合:{{1,2},{3}},{{1,3},{2}},{{2,3},{1}}
    ③ 3个子集的集合:{{1},{2},{3}}
    ∴F(3,1)=1;F(3,2)=3;F(3,3)=1;

    如果要求F(4,2)该怎么办呢?

    A.往①里添一个元素{4},得到{{1,2,3},{4}}

    B.往②里的任意一个子集添一个4,得到
    {{1,2,4},{3}},{{1,2},{3,4}},
    {{1,3,4},{2}},{{1,3},{2,4}},
    {{2,3,4},{1}},{{2,3},{1,4}}
     

    ∴F(4,2)=F(3,1)+2*F(3,2)=1+2*3=7

    解题思路:

    递归。上面已经说得很清楚了F(n,m)=F(n-1,m-1)+F(n-1,m)*m

    注意当n=0时需另外讨论。

    #include<stdio.h>
    
    int F(int n,int m)//n个元素,m个子集合
    {
       if(n<m)
    	   return 0;
       else
       {
          if(n==0||n==m||n==1||m==1)
    		  return 1;
    	  else
    		  return F(n-1,m-1)+m*F(n-1,m);
       }
    }
    int main()
    {
    	int n;
    	int cnt=0;
    	while(scanf("%d",&n)!=EOF)
    	{
          if(n==0)//n=0时单独讨论
    	  {
    	     printf("1\n");
    		 continue;
    	  }
    	  cnt=0;
    	  int i;
    	  for(i=1;i<=n;i++)
    		  cnt+=F(n,i);
    
    	  printf("%d\n",cnt);
    	}
      return 0;
    }

     

    展开全文
  • POJ 3253:集合的划分

    2018-05-14 21:50:12
    总时间限制: 1000ms内存限制: 65536kB描述把一个集A(本题中的集合均不含重复元素)分成若干个非空子集,使得A中每个元素属于且仅属于一个子集,那么这些子集构成的集合称为A的一个划分。比如A={1,2,3},那么{ {1}...
    总时间限制: 
    1000ms
    内存限制: 
    65536kB
    描述
    把一个集A(本题中的集合均不含重复元素)分成若干个非空子集,使得A中每个元素属于且仅属于一个子集,那么这些子集构成的集合称为A的一个划分。比如A={1,2,3},那么{ {1},{2 ,3} }以及{ {1},{2},{3} } 都是A的划分。现在给定一个整数n,我们希望知道包含n个元素的集合有多少不同的划分。当n=3的时候,仍然考虑集合{1,2,3},它的所有划分如下
    { {1} , {2} , {3} }
    { {1 , 2} , {3} }
    { {1 , 3} , {2} }
    { {1} , {2 , 3} } 
    { {1 , 2 , 3} }
    只有5种,但随n的增加,划分方法的个数会以指数速度增加。比如n=4的时候,就有15种方法,考虑集合{1,2,3,4},划分方式如下
    { {1},{2},{3},{4}}
    {{1},{2},{3,4}}
    {{1,2},{3},{4}}
    {{1,3},{2},{4}}
    {{1,4},{2},{3}}
    {{1},{2,3},{4}}
    {{1},{3},{2,4}}
    {{1,2},{3,4}}
    {{1,3},{2,4}}
    {{1,4},{2,3}}
    {{1},{2,3,4}}
    {{2},{1,3,4}}
    {{3},{1,2,4}}
    {{4},{1,2,3}}
    {{1,2,3,4}}
    当n>15的时候,划分方法数将超过32位整数所能表示的范围,我们希望你的程序能计算出n<=15的时候,包含n个元素的集合的划分方法的个数
    输入
    一个整数n(0<=n<=15,n=0的时候认为有一种划分方法)
    输出
    包含n个不同元素的集合的划分方法的个数
    样例输入
    3
    15
    样例输出
    5
    1382958545
    提示
    递归公式,
    设n个元素的集合可以划分为F(n,m)个不同的由m个非空子集组成的集合。
    F(n,m) = 1, where n=0, n=m, n=1, or m=1
    F(n,m) = 0, where n<m
    否则
    F(n,m)=F(n-1,m-1)+m*F(n-1,m)

    例如:
    考虑3个元素的集合,可划分为
    ① 1个子集的集合:{{1,2,3}}
    ② 2个子集的集合:{{1,2},{3}},{{1,3},{2}},{{2,3},{1}}
    ③ 3个子集的集合:{{1},{2},{3}}
    ∴F(3,1)=1;F(3,2)=3;F(3,3)=1;

    如果要求F(4,2)该怎么办呢?

    A.往①里添一个元素{4},得到{{1,2,3},{4}}

    B.往②里的任意一个子集添一个4,得到
    {{1,2,4},{3}},{{1,2},{3,4}},
    {{1,3,4},{2}},{{1,3},{2,4}},
    {{2,3,4},{1}},{{2,3},{1,4}}

    ∴F(4,2)=F(3,1)+2*F(3,2)=1+2*3=7

    这道题是根据提示的原理一次通过的,自己的想法是排列组合的方法,单独考虑一个一组,两个一组直到n个一组的情况,但是又要分偶数个数奇数个数情况很多很混乱,最后还是采用了提示给的简洁明了的方法。

    #include <iostream>
    using namespace std;
    int main(){
    	int rec[16][16];
    	int n;
    	rec[3][1]=1;
    	rec[3][2]=3;
    	rec[3][3]=1;
    	while(cin>>n){
    		int sum;
    		if(n==0||n==1){
    		    sum=1;
    		    printf("%d\n",sum);
    		    continue;
    	    }
    	    if(n==2){
    	    	sum=2;
    	    	printf("%d\n",sum);
    	    	continue;
    		}
    		if(n==3){
    			sum=rec[3][1]+rec[3][2]+rec[3][3];
    			printf("%d\n",sum);
    			continue;
    		}
    		int k=4;
    		while(k<=n){
    			int p=1;
    			rec[k][p]=1;
    			p++;
    			while(p<k){
    				rec[k][p]=rec[k-1][p-1]+rec[k-1][p]*p;
    				p++;
    			}
    			rec[k][p]=1;
    			k++;
    		}
    		sum=0;
    		for(int i=1;i<=n;i++){
    			sum+=rec[n][i];
    		}
    		printf("%d\n",sum);
    	}
    	return 0;
    }

    展开全文
  • Description定义集合 A={1,2,3…,n} , 现在有一个 A->A 的函数 f(x) , 也就是说这个函数的 定义域是 A, 值域是 A 的非空子集。 现在请你找出有多少种可能的 f(x) , 使得对于所有 x0(x0∈ A) , f(f(x0)) 都为同...

    Description

    定义集合 A={1,2,3…,n} , 现在有一个 A->A 的函数 f(x) , 也就是说这个函数的 定义域是 A, 值域是 A 的非空子集。
    现在请你找出有多少种可能的 f(x) , 使得对于所有 x0(x0∈ A) , f(f(x0)) 都为同 一个值。 请将方案数 mod 10^9+7 后输出 。
    Input

    第一行一个正整数 n, 表示集合 A。

    Output

    第一行一个数 Ans, 表示 f(x) 可能方案数。

    Sample Input

    3

    Sample Output

    9

    样例解释

    所有满足条件的 f() 如下(三个数分别表示 f(1) 、 f(2) 、 f(3) ):
    {1 1 1} {1 1 2} {1 3 1}
    {2 2 2} {2 2 1 } {2 3 3}
    {3 3 3} {3 1 3} {3 2 2}
    一共有 9 种不同的 f() 。

    数据范围

    对于 20%的数据, n≤8。
    对于 40%的数据, n≤20。
    对于 60%的数据, n≤1500。
    对于 100%的数据, n≤10^5。

    solution

    组合数,乘法逆元,费马小定理,快速幂…..这些还是理理清楚比较好
    用快速幂实现费马小定理,用费马小定理求逆元,用逆元求组合数,用组合数求在n-1个数中取L-1个数的方案数,用快速幂求剩余n-L个数在L-1个数中取的方案数,两者乘起来加上ans,最后ans*n,因为p有n种可能。
    设最后都收束为p,显然f(p)=p。设有L个f(x)=p,除了p还要任选L-1个数,剩下n-L都要在这L-1个位置中任取。枚举L,复杂度为O(n);

    其实最暴力的n的n次方的打表还是有20分的呢

    Code

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    typedef long long int64;
    
    const int S = 100010;
    const int mo = (int)1e9 + 7;
    
    int n, fac[S];
    int c1, c2, ans;
    int ksm(int a, int b)//快速幂求a的b次方并返回逆元值
    {
         if (a < 0 || b < 0) return 0;
         int w = 1;
         for (; b; b >>= 1, a = (int64)a * a % mo)
          if (b & 1) w = (int64)w * a % mo;
         return w;
    }
    /*
      这个是错误的快速幂
    
    int ksm(int a,int b)
     {
        if(a<0||b<0) return 0;
        int m=1;
        b>>=1;
        while(b)
          {
        if(b&1) m=(int64)m*a%mo;
        a=a*a%mo;
        b>>=1;
          }
        return m;
        }*/
    int inv(int x)//用费马小定理求逆元
      {
        return ksm(x,mo-2);
      }
    int main()
    {
      freopen("set.in" , "r", stdin);
      freopen("set.out", "w", stdout);
      scanf("%d",&n);
      fac[0]=1;
      for(int i=1;i<=n;i++)
        fac[i]=(int64)fac[i-1]*i%mo;//求阶乘
      for(int L=1;L<=n;L++)
        {
          c1=(int64)fac[n-1]*inv(fac[n-L])%mo*inv(fac[L-1])%mo;//在n-1中选取n-L个数的方案数
          c2=(int64)ksm(n-L,L-1);//快速幂求n-L的L-1次方,即剩余的n-L个数有多少种选择方法
          ans+=(int64)c1*c2%mo;ans%=mo;
        }
      ans=(int64)ans*n%mo;//总共第一个数可以取n种
      printf("%d\n",ans);
      return 0;
    }
    
    展开全文
  • 集合的划分问题(动态规划DP)

    千次阅读 2017-07-25 09:17:19
    给定正整数n,计算出n个元素的集合{1,2,, n }可以划分为多少个不同的非空子集。  思路:对于n个元素的集合,可以划分成由m(1  1)若m==1,则f(n,m)=1;  2)若n==m,则f(n,m)=1;  3)若非以上两种情况,f(n,m)可以...
  • 我们称一个非空子集元素的排列为一个子集序列。对所有的子序列按字典顺序排序。你的任务就是给出第m个子序列。 Algorithm Analyse   首先我们来看看An一共有多少个子集。 n=1时,
  • HDU 5363(2015多校6)-Key Set(快速幂取模)

    千次阅读 2015-08-07 15:14:44
    题意:给你一个具有n个元素的集合S{1,2,…,n},问集合S的非空子集中元素和为偶数的非空子集有多少个。 思路:解释转自[queuelovestack的专栏]因为集合S中的元素是从1开始的连续的自然数,所以所有元素中奇数个数...
  • 题意:在一个集合中找到一个非空子集使得这个子集元素和的绝对值尽量小,和绝对值相同时保证元素个数尽量小 1.折半枚举,先分成两部分,第一部分用二进制枚举所有情况,并记录在数组中,数组中应该记录两个元素,一...
  • 有多少个非空子集,能划分成和相等的两份。 Solution 直接对于这n个数分成左右两个部分,然后考虑每一个数: 在第一个集合 在第二个集合 两个集合都不在 所以可以直接对于这个东西搞一个Map和一个Set存一下,考虑把...
  • 给定一个集合有多少个非空子集,能划分成和相等的两份。\(n\leq 20\) 题解 看到这个题,首先能想到的是\(3^n\)的暴力枚举,枚举当前元素是放入左边还是放入右边或者根本不放,但是显然是不可取的,看到\(n\)只有20...
  • 题意:给n个元素,从n中选两个非空集合A和B...加入集合有三种选择,A,B,E(可空的集合),或者自成集合,作为A或B,然后在选一个n-1个元素的非空子集(2^n-1 - 1)。 #include<cstdio> const int m...
  • 18.10.16 队测

    2018-10-16 18:08:00
    求给定集合有多少个非空子集可以分割成两个集合,使得它们的和相等。 其中:\(n\leq20~,~a[i]\leq1e8\) 题目可以转化成:给每个数前添加一个系数\(p\in[-1,1]\),使得和为0的方案数。 由于\(n\)比较小,所以可以考虑...
  • hdu 2062 Subset sequence

    2019-10-06 20:58:29
    我们称一个非空子集元素的排列为一个子集序列。对所有的子序列按字典顺序排序。你的任务就是给出第m个子序列 首先我们来看看An一共有多少个子集。 n=1时,只有{1}一个子集合 n=2时,就有: {1}, {2}, {1, 2}, ...
  • 称一个非空子集(元素均非负)的集合是完美的当且仅当其对异或运算封闭,问所包含元素为不超过kk的非负整数的集合有多少是完美的 Input 一个整数k(1≤k≤109)k(1\le k\le 10^9) Output 输出满足条件的集合个数...
  • [SRM478]RandomApple

    2018-09-04 11:41:00
    题意:$k$种苹果和$n$个箱子,每个箱子中一些苹果,先等概率选取$n$个箱子组成集合非空子集,再从选出的苹果中随机选一个,问每种苹果被选中的概率是多少 设箱子$i$$cnt_{i,j}$个第$j$种苹果,第$i$个箱子...
  • 例题:把n个数分为k个非空子集有多少种分法? 分解问题:第一个集合里放多少个数把原问题的解分成了独立且完备的方向,分别解每个方向上的方案数,然后相加 memo = [[-1] * (1000) for i in xrange(1001)] def ...
  • 题目大意:给你一个数组,问有多少个非空子集满足集合中所有数字的乘积是一个平方数。结果mod 1e9+7。首先就可以想到把所有数出现的次数记录一下。由于唯一分解定理可知若一个数是平方数,那么它唯一分解后质因子的...
  • subsets(2018.10.16)

    2018-10-16 21:29:00
    一句话题意:给你一个包含n个元素的集合,问有多少个非空子集,能划分成和相等的两份。(n<=20) 题解:对于这道题,我们很轻易可以列出\(O(3^n)\)的暴力,这是显然过不了的,观察这道题的性质可以发现我们显然可以...
  • 给一些数,求能取出多少个非空子集使所有数相乘为完全平方数. n≤105,ai≤70n\leq 10^5,a_i\leq70n≤105,ai​≤70. 题解 707070以内的质数只有191919个,并且一个数的平方性可以用每一个质数的奇偶性判断,不妨用一个...
  • 给你一个元素为1到n的集合,让你求有多少个非空子集,子集内的元素之和为偶数。 解析: 子集中满足元素之和为偶数那么得满足几何中的奇数必须为偶数个。 那么偶数的情况可以任意取。一个几何中有 n/2n/2 个偶数...
  • 给你一个元素为1到n的集合,让你求有多少个非空子集,子集内的元素之和为偶数。 由于结果比较大,所以要用到快速幂取模。 */ //由数学分析:无论n为奇数还是偶数 //结果为2^(n-1)-1 #include #include int main...
  • 定义f(u,v)为u和v的距离,g(u,v,w)=((f(u,v)+f(u,w)+f(v,w))/2,定义这n个点的非空子集P是最好的当且仅当P中含有一个最好点对(u,v),最好点对定义是,对集合P中任一点w,(u,v)满足f(u,v)>=g(u,v,w),问有多少种不同...
  • HDU 5363 Key Set

    2015-08-06 19:05:15
    分析:给你一个元素为1~n的集合,让你求有多少个非空子集,子集内的元素之和为偶数。容易推出:ans=2^(n-1)-1,因为n过大,所有用快速幂来求。 # include __int64 FastExp(__int64 a,__int64 b) { __int64 ans=1...
  • http://acm.hdu.edu.cn/showproblem.php?pid=5363给你一个元素为1到n的集合,让你求有多少个非空子集,子集内的元素之和为偶数。简单的推公式,很容易推出结果是2^(n-1)-1 因为n的结果比较大,所以要用到快速幂。#...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

一个集合有多少个非空子集