奇怪的分组(stone)

原创 2015年07月08日 16:43:25

背景描述:

终于解出了dm同学的难题,dm同学同意帮v神联络。可dm同学有个习惯,就是联络同学的时候喜欢分组联络,而且分组的方式也很特别,要求第i组的的人数必须大于他指定的个数ci。在dm同学联络的时候,v神在想,按照dm同学的规则一共可以有多少种方案呢?他想啊想,终于……没想出来。于是他又想到了聪明的你,你能帮v神算出按照dm同学的规则有多少种分组方案吗?

题目描述:

v神的班级共有n个人,dm同学想把同学分成M组联络,要求第i组的人数必须大于给定的正整数Ci,求有多少不同的方案?(两个是相同的方案当且仅当对于任意的一队i,两个方案的第i组同学数量相等)由于结果很大,所以你只需要输出模1000000007的值。

 

输入格式:

第一行两个整数N和M ,后面有M行,每行一个整数,表示Ci

 

输出格式:

仅有一行,一个整数,方案数模1000000007的值。

 

样例输入:

10 3

1

2

3

 

 

样例输出:

3

 

样例解释:

方案有三种,每堆的个数分别是(3,3,4),(2,4,4),(2,3,5)。

 

数据范围约定:

对于30%的数据,N ,M<= 10

对于60%的数据,N ,M<=1000

对于100%的数据,N ,M<= 1000000 Ci<=1000

数据保证至少有一个方案


由组合的知识得答案是C(N-sigma(ci)-1,m-1),然后大数据不知道怎么搞,用前辈的模板可以A,数论知识还是太弱了,慢慢研究

前辈的模板qingyezhu


#include<iostream>
#include<cstring>
#define LL long long
#define N 1000010
using namespace std;
const long long  r=1000000007;
int x, y;
long long n,m;
void extend_gcd(int a, int b) {
    int xx;
    if (b == 0) {
        x = 1, y = 0;
        return;
    }
    extend_gcd(b, a % b);
    xx = x;
    x = y, y = xx - a / b * y;
}
int C(int a, int b, int p) {
    int i;
    LL resa, resb, res;
    if (b > a) {
        return 0;
    }
    for (i = 0, resa = 1, resb = 1; i < b; i++) {
        resa = resa * (a - i) % p, resb = resb * (b - i) % p;
    }
     extend_gcd(resb, p);
     res = (LL) x;
     res = (res % p + p) % p;
    res = res * resa % p;
    return (int) res;
}
void solve(int n, int m, int p) {
    int a, b;
    LL res;
    res = 1;
    while (n || m) {
        a = n % p, b = m % p;
        res = res * C(a, b, p) % p;
        n /= p, m /= p;
    }
    printf("%I64d\n", res);
}
int main()
{
	freopen("stone.in","r",stdin);
	freopen("stone.out","w",stdout);
	
	long long t,ans=0;
	scanf("%I64d%I64d",&n,&m);
	for (int i=0;i<m;++i) 
	{
		scanf("%I64d",&t);
		n-=t;
	}
	n-=1,m-=1;
	solve(n,m,r);
	return 0;
}


奇怪的分组 组合数

背景描述: 终于解出了dm同学的难题,dm同学同意帮v神联络。可dm同学有个习惯,就是联络同学的时候喜欢分组联络,而且分组的方式也很特别,要求第i组的的人数必须大于他指定的个数ci。在dm同学联络的...
  • qq397470071
  • qq397470071
  • 2011年11月10日 10:47
  • 349

吉林大学2013级大一下学期程序设计作业:同学通讯录系统

《程序设计基础课程设计》题目(2013级)   1、内容简介 编写一个C语言程序,实现同学通讯录管理功能。其中: 1)至少能够管理50位同学的个人信息和通讯信息,个人信息和通讯信息需要有较强的...
  • u013613980
  • u013613980
  • 2014年06月26日 10:25
  • 2385

特权同学的FPGA/CPLD设计学习笔记

题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢。这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一...
  • Tony_MPF
  • Tony_MPF
  • 2015年11月21日 13:24
  • 1164

九度OJ 题目1131:合唱队形

 一.题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。  合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, ...
  • lhyer
  • lhyer
  • 2015年08月28日 11:36
  • 581

关于查询和"1"号的同学学习的课程完全相同的其他同学的信息详细

以下是建表语句: create table bdqn_student( sno number(2), sname varchar2(20) not null, sbirthdate date, sge...
  • qwe3642
  • qwe3642
  • 2016年11月24日 11:50
  • 586

膜拜 解题报告

洛谷P1564 题目描述 神牛有很多…当然…每个同学都有自己衷心膜拜的神牛. 某学校有两位神牛,神牛甲和神牛乙。新入学的N 位同学们早已耳闻他们的神话。 所以,已经衷心...
  • qq_40512553
  • qq_40512553
  • 2017年10月18日 19:10
  • 744

vijos 1106 & NOIP2003 提高组 侦探推理 题解

【原题】 P1106侦探推理 Accepted 标签:[显示标签] 描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推...
  • u013724185
  • u013724185
  • 2014年07月04日 19:48
  • 1610

京东—幸运数

小明同学学习了不同的进制之后,拿起了一些数字做起了游戏。小明同学知道,在日常生活中我们最常用的是十进制数,而在计算机中,二进制数也很常用。现在对于一个数字x,小明同学定义出了两个函数f(x)和g(x)...
  • jiangerchi
  • jiangerchi
  • 2017年09月05日 17:09
  • 121
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:奇怪的分组(stone)
举报原因:
原因补充:

(最多只允许输入30个字)