Atcoder arc077 D - 11 组合

Link

题意:给出n个数,其中有一个数会出现两次,其余数只出现一次,问不同长度且不同的子串的数量。取模1e9+7

思路:组合求出所有情况,减去重复情况,注意用逆元即可

/** @Date    : 2017-07-06 09:56:44
  * @FileName: atcoder077 D 组合.cpp
  * @Platform: Windows
  * @Author  : Lweleth ([email protected])
  * @Link    : https://github.com/
  * @Version : $Id$
  */
#include <bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8;
const LL mod = 1e9 + 7;

LL a[N];
LL inv[N];
LL fa[N];
LL n;

void init()
{
	fa[0] = fa[1] = 1;
    inv[1] = 1;
    for(LL i = 2; i < N; i++)
    {
        fa[i] = fa[i-1] * i % mod;
        inv[i] = (mod - mod / i) * inv[mod % i] % mod;
    }
    inv[0] = 1;
    for(int i = 1; i < N; i++)
    	(inv[i] *= inv[i - 1]) %= mod;
}

LL C(LL n, LL k)
{
	LL ans = 0;
	if(k > n)
		return ans;
	ans = ((fa[n] * inv[k] % mod) * inv[n - k]) % mod;
	return ans;
}
int main()
{
	init();
	while(cin >> n)
	{
		map<LL, int>q;
		LL p = 0;
		for(int i = 1; i <= n + 1; i++)
		{
			scanf("%lld", a + i);
			if(!q[a[i]])
				q[a[i]] = i;
			else
				p = i;
		}
		for(int i = 0; i <= n; i++)
		{
			LL ans = 0;
			ans = (ans + C(n + 1, i + 1)) % mod;
			ans = (ans - C(n - p + q[a[p]], i)) % mod;
			while(ans < 0)
				ans += mod;
			printf("%lld\n", ans);
		}
	}
    return 0;
}
时间: 2024-12-21 05:52:37

Atcoder arc077 D - 11 组合的相关文章

11 组合模式

组合模式(Composite)定义:将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. UML类图如下: 比如<大话>中举的例子,公司总部在北京,然后在南京.杭州设有办事处,总公司和分支办事处都有相似的组织结构,比如都有人力资源部.财务部等.如下图: 再有HeadFirst举的关于菜单的例子,如下图: 如果程序需要表达上面例子中的公司层级组织或是菜单层级的结构,就可以采用组合模式. 组合模式能让我们用树形方式创建对象的

AtCoder AGC036C GP 2 (组合计数)

题目链接 https://atcoder.jp/contests/agc036/tasks/agc036_c 题解 终于有时间补agc036的题了. 这题其实不难的来着--我太菜了考场上没想出来 首先转化一下题目: 一个序列可以被按题目的操作方式生成当且仅当它长度为\(N\), 总和为\(3M\), 且最大数不超过\(2M\), 奇数的个数不超过\(M\). 必要性显然,充分性归纳易证. 然后考虑怎么计数: 先不考虑第二个条件,定义\(f(n,m,k)\)表示长度为\(n\)总和为\(m\)奇数

AtCoder AGC032F One Third (组合计数、DP、概率期望、微积分)

题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_f 题解 神仙题.. 第一步转化利用了\(\frac{1}{3}\)这个数特有的性质.假设我们用红线标出每一次切割的位置,再在每一次切割的位置顺时针\(120\)度处用蓝线标出,那么答案就等于红线与蓝线之间的最小夹角.但是这样转化完了依然不好做(而且似乎也没用到\(\frac{1}{3}\)的特殊性),那么考虑如果在每一次切割的位置逆时针\(120\)度处用绿线标出,答案依然是不变的,因为\

AtCoder AGC035F Two Histograms (组合计数、容斥原理)

题目链接 https://atcoder.jp/contests/agc035/tasks/agc035_f 题解 B题难度的F题--然而我还是不会 假设第\(i\)行染的长度是\(a_i\), 第\(j\)列是\(b_j\) 考虑什么情况下两种方案会重复: 若存在\(i,j\)使得\(a_i+1=j\)且\(b_j=i\), 那么令\(a'_i=j-1,b'_j=i+1\)可以得到一样的结果. 那么我们也就是要计算不存在\(a_i+1=j\)且\(b_j=i\)的序列\(a,b\)个数. 充分

MySQL之SQL基础

SQL是Structure Query Language(结构化查询语言)的缩写,它是关系型数据库的应用语言,由IBM在20世纪70年代开发,以实现关系型数据库中的信息检索. 在20世纪80年代初,美国国家标准局(ANSI)开始着手制定SQL标准,最早的ANSI标准于1986年完成,就被叫做SQL-86.正是由于SQL语言的标准化,所以大多数关系型数据库都支持SQL语言,它已经发展成为多种平台进行交互操作的底层会话语言. SQL的分类: DDL:数据定义语言,即是对数据库内部对象进行创建.删除.

简述23种软件设计模式

简述23种软件设计模式 一.设计模式分类 总体来说设计模式分为三大类: 五种创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 七种结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 十一种行为型模式:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 二.设计模式概述 创建型模式 1.工厂方法模式 工厂方法模式的创建是因为简单工厂模式有一个问题,在简单工厂模式

设计模式解读

今天上课的时候,王老师问我们什么是设计模式?当时我们并没有回答上来,设计模式对于我们了解架构来说很重要,于是就有了这次的作业. "设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码的可靠性."这是设计模式上对于设计模式的定义,我们最常用的设计模式一共有23种,根据其目的可以把它们分成创建型.结构型和行为型三种.创建型模式主要用于创建对象,分别有工厂方法模式.抽象工厂模式.建造者模式.原型模式和单例模

23种状态模式的理解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代器模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 工厂方法模式 首先,良好的封装性,代码结构清晰.一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名就可以

Java中23种设计模式--超快速入门及举例代码

在网上看了一些设计模式的文章后,感觉还是印象不太深刻,决定好好记录记录. 原文地址:http://blog.csdn.net/doymm2008/article/details/13288067 注:本文代码基本都有很多没有初始化等等问题,主要是为了减少代码量,达到一眼就能了解大概情况的目的. java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,