排列组合或容斥原理 SPOJ - AMR11H
题目链接: https://vjudge.net/contest/237052#problem/H
这里给你一串数字,让你计算同时拥有这串数字最大值和最小值的子集(连续)和子序列(可以不连续)的数量,计算子串的数量是为了避免重复,我们可以从前往后扫描,前面的子集不能包括后面的,后面的可以包括前面的,我们每次记录最小值和最大值的位置t1,t2,起初把t1,t2设为0,每当遇到最大值或最小值是就把t1或t2的值变成最小值或最大值的下标,然后sum=sum+min(t1,t2),我也是刚刚看别人博客才知道的,举个例子:
2 1 4 3 2 1 min=1,max=4,t1=0,t2=0;
i=1, t1=0,t2=0,sum=min(0,0)+sum=0;
i=2, t1=2,t2=0,sum=min(2,0,)+sum=0;
i=3, t1=2,t2=3,sum=min(2,3)+sum=2,有2 1 4和1 4
i=4, t1=2,t2=3,sum=min(2,3)+sum=4, 有2 1 4 3和1 4 3
i=5, t1=2,t2=3,sum=min(2,3)+sum=6,有2 1 4 3 2和1 4 3 2
i=6, t1=6,t2=3,sum=min(6,3)+sum=9,有2 1 4 3 2 1和1 4 3 2 1 和4 3 2 1
然后我们要求子序列的话可以用两种方法求,一种是排列组合,我们在上面求子集数量时同时求最大值和最小值的数量,因为可能会多次出现,分别设为min_num,max_num,那我们如果要用排列组合算的话就是(2^min_num-1)*(2^max_num-1)*2^(n-min_num-max_num),自己揣摩一下,然后用容斥原理的话就是所有情况-没有最大值的情况-没有最小值的情况+没有最大值和最小值的情况
看代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const ll inf=0xffffff;
const ll mod=;
ll n,m,k,t;
ll num[];
ll cal(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&)
ans=ans*a%mod;
a=a*a%mod;
b>>=;
}
return ans;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
ll min1=inf,max1=,min_num=,max_num=;
ll sum1=,sum2=;
for(int i=;i<=n;i++)
{
cin>>num[i];
min1=min(min1,num[i]);
max1=max(max1,num[i]);
}
if(min1==max1)
{
sum1=n*(n+)/%mod;
sum2=cal(,n)-;
cout<<sum1<<' '<<sum2<<endl;
continue;
}
ll t1=,t2=;
for(int i=;i<=n;i++)
{
if(min1==num[i])
{
t1=i;
min_num++;
}
if(max1==num[i])
{
t2=i;
max_num++;
}
sum1=(min(t1,t2)+sum1)%mod;
}
sum2=((cal(,min_num)-)%mod*(cal(,max_num)-)%mod*cal(,n-max_num-min_num))%mod;//排列组合
/*sum2=(cal(2,n)-cal(2,n-max_num)-cal(2,n-min_num)+cal(2,n-max_num-min_num))%mod;//容斥原理
if(sum2<0)
sum2+=mod;*/
cout<<sum1<<' '<<sum2<<endl;
}
return ;
}
排列组合或容斥原理 SPOJ - AMR11H的更多相关文章
- 【专题】计数问题(排列组合,容斥原理,Prufer序列)
		[容斥原理] 对于统计指定排列方案数的问题,一个方案是空间中的一个元素. 定义集合x是满足排列中第x个数的限定条件的方案集合,设排列长度为S,则一共S个集合. 容斥原理的本质是考虑[集合交 或 集合交 ... 
- hdu 4497 GCD and LCM 质因素分解+排列组合or容斥原理
		//昨天把一个i写成1了 然后挂了一下午 首先进行质因数分解g=a1^b1+a2^b2...... l=a1^b1'+a2^b2'.......,然后判断两种不可行情况:1,g的分解式中有l的分解式中 ... 
- HDU 4497 GCD and LCM(分解质因子+排列组合)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满 ... 
- SPOJ - AMR11H  Array Diversity (水题排列组合或容斥)
		题意:给定一个序列,让你求两种数,一个是求一个子序列,包含最大值和最小值,再就是求一个子集包含最大值和最小值. 析:求子序列,从前往记录一下最大值和最小值的位置,然后从前往后扫一遍,每个位置求一下数目 ... 
- [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
		[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ... 
- [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)
		[Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ... 
- GYM 101933K(二项式反演、排列组合)
		方法一 设\(f_i\)为最多使用\(i\)种颜色的涂色方案,\(g_i\)为恰好只使用\(i\)种颜色的涂色方案.可知此题答案为\(g_k\). 根据排列组合的知识不难得到\(f_k = \sum_ ... 
- 学习sql中的排列组合,在园子里搜着看于是。。。
		学习sql中的排列组合,在园子里搜着看,看到篇文章,于是自己(新手)用了最最原始的sql去写出来: --需求----B, C, F, M and S住在一座房子的不同楼层.--B 不住顶层.C 不住底 ... 
- .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
		今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ... 
随机推荐
- git openssl 模块生成 https 请求的 ssl 测试证书
			1,请先确定安装了相关模块 1.1,git --version 1.2,openssl version -a 2,创建一个目录, cd 到该目录下 3,生成私钥 key 文件 openssl g ... 
- Appium -选择、操作元素
			选择界面元素 操作元素(点击.输入字符.拖拽.获取页面元素的各种属性) 根据Appium获取的数据进行分析和处理 desired_capabilities 查看appPackage 和appActiv ... 
- 浅谈 CAS
			CAS: CAS:Compare and Swap, 翻译成比较并交换. java.util.concurrent包中借助CAS实现了区别于 synchronized 同步锁的一种乐观锁. CAS应用 ... 
- day37-常见内置模块六(其他模块)
			其他内置模块 1.subprocess(系统交互)模块 2.math模块 3.zipfile模块 4.keyword模块 5.... 
- vue - @click 用到的修饰符
			1.vue提供的方法 .stop .prevent .capture .self .once .passive <!-- 阻止单击事件继续传播 --><a v-on:click.st ... 
- Spark/Storm/Flink
			https://www.cnblogs.com/yaohaitao/p/5703288.html Spark Streaming与Storm的应用场景 对于Storm来说:1.建议在那种需要纯实时, ... 
- linux文本处理笔记
			cut: 按列操作文本 sort: 排序 uniq: 去重,去除连续重复行 cut -d 'delimiter' -f start-end filename.txt # -d 表示分割符号,del ... 
- UNITY  多个子MESH与贴图的对应关系
			多个贴图时,与子MESH一一对应,如果多了 ...还待研究如何对应 
- html兼容手机浏览器
			其实主要就是改掉HTML页面声明: 在网页中加入以下代码,就可以正常显示了: <meta name="viewport" content="width=device ... 
- C++随记
			1.const限定符 const限定变量的值不可变,并且const对象必须要初始化 const int buf = 512; //正确,表明buf的值为512 buf = 400; //错误,buf ... 
