SPOJ16607 IE1 - Sweets
题面
传送门:
Solution
这题的想法挺妙的。
.
首先,对于这种区间求答案的问题,我们一般都可以通过类似前缀和的思想一减来消去a,即求[a,b]的答案可以转化为求[1,b]-[1,a-1]
接下来我们可以先考虑一下每个物品数量不限制的做法。我们可以把这个问题类比为放球问题:我们要在n个相同的盒子里放x个球,这个问题可以用隔板法解决,显然答案为\(C_{x+n-1}^{n-1}\)
因为我们的n特别小,而且p为合数,所以可以用分解质因数的方法来算这个组合数。
.
接下来,我们可以考虑一下如何处理多计算的答案,考虑用容斥定理来解决这个问题。
不了解容斥定理的同志可以先看一下这篇文章
我们要求的是至少有一个物品不满足要求的方案总数,即求所有不满足要求的方案的并。
根据容斥定理,这个并的值为 \(\sum有一个物品不满足要求-有两个物品不满足要求+有三个物品不满足要求-...\)
所以说,我们只需要强制某些物品先选\(m_i+1\)个,再按照上面的放球问题的公式来计算就可以得出有若干个物品不满足要求的方案数。
答案即为总方案数-不满足要求的方案数的并
时间复杂度\(O(2^n*log_{max(a,b)})\)
这个问题就被我们切掉啦ヽ( ̄▽ ̄)ノ
.
如果有不清楚的地方可以看一下代码。
Code
//Luogu SP16607 IE1 - Sweets
//Jan,14th,2019
//容斥原理的应用
#include<iostream>
#include<cstdio>
using namespace std;
long long read()
{
	long long x=0,f=1; char c=getchar();
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x*f;
}
const int poi=2004;
const int N=15;
int prime[6]={-1,2,3,5,7};
long long C(long long x,long long y)//x为底,y为指
{
	if(y>x) return 0;
	int cnt[6]={0};
	long long t_ans=1;
	for(long long i=x-y+1;i<=x;i++)
	{
		long long t_num=i;
		for(int j=1;j<=4;j++)
			while(t_num%prime[j]==0)
			{
				t_num/=prime[j];
				cnt[j]++;
			}
		t_ans=(t_ans*t_num)%poi;
	}
	for(long long i=1;i<=y;i++)
	{
		long long t_num=i;
		for(int j=1;j<=4;j++)
			while(t_num%prime[j]==0)
			{
				t_num/=prime[j];
				cnt[j]--;
			}
		}
	for(int i=1;i<=4;i++)
		while(cnt[i]>0)
			t_ans=(t_ans*prime[i])%poi,cnt[i]--;
	return t_ans;
}
int m[N],n,a,b;
long long t_ans2,t_x;
bool used[N];
void dfs(int now)
{
	if(now==n+1)
	{
		long long t_cnt=0,tot=0;
		for(int i=1;i<=n;i++)
			if(used[i]==true)
				t_cnt+=m[i]+1,tot++;
		if(t_cnt>t_x) return;
		long long f=(tot%2==1?-1:1);
		t_ans2+=f*C(t_x-t_cnt+n,n);
		t_ans2=(t_ans2%poi+poi)%poi;
		return;
	}
	for(int i=0;i<=1;i++)
		used[now]=i,dfs(now+1);
}
long long Calc(long long x)
{
	t_ans2=0,t_x=x;
	dfs(1);
	return t_ans2;
}
int main()
{
	n=read(),a=read(),b=read();
	for(int i=1;i<=n;i++)
		m[i]=read();
	printf("%lld",((Calc(b)-Calc(a-1))%poi+poi)%poi);
	return 0;
}
												
											SPOJ16607 IE1 - Sweets的更多相关文章
- WC2019 填坑记
		
2019年1月8日 1.Luogu P2147 [SDOI2008]洞穴勘测 (LCT模板题&LCT学习) 2019年1月9日 2.LuoguP3203 [HNOI2010]弹飞绵羊 (LC ...
 - 万圣节的糖果(Halloween Sweets)
		
今天遇到codewars的一道题,这是链接,讲的是关于万圣节的一个题目,简单点说,就是9个包裹,一个天平,两次称的机会,怎么找出9个包裹中唯一一个较重的包裹. 像我这种年轻时候喜欢研究难题获得存在感的 ...
 - BZOJ 3027 Sweets 生成函数,容斥
		
Description John得到了n罐糖果.不同的糖果罐,糖果的种类不同(即同一个糖果罐里的糖果种类是相同的,不同的糖果罐里的糖果的种类是不同的).第i个糖果罐里有 mi个糖果.John决定吃掉一 ...
 - 题解-CodeChef IOPC14L Sweets Problem
		
Problem CodeChef-IOPC14L 题目概要:给定 \(n\) 种糖果且给定每种糖果的数量 \(A_i\),\(Q\) 组询问,每次问选出 \(S\) 个糖果的方案数(模\(10^9+7 ...
 - cf1158A-The Party and Sweets - (贪心+思维)
		
题意:有n个男孩,m个女孩,每个男孩给每个女孩一堆糖果.b数组表示每个男孩给出的最少糖果数,g数组表示每个女孩子收到的最大糖果数.求所有男孩给出的最小糖果总数. 解题: 先对b数组和g数组从小到大排序 ...
 - The Party and Sweets CodeForces - 1159C (拓排)
		
优化连边然后拓排. #include <iostream> #include <sstream> #include <algorithm> #include < ...
 - Codeforces Round #600 (Div. 2) 	C - Sweets Eating
		
#include<iostream> #include<algorithm> #include<cstring> using namespace std ; typ ...
 - C - Sweets Eating
		
规律题 前缀和+规律 先求前缀和...答案为c[i]=arr[i]+c[i-m]//i>m时. #include<bits/stdc++.h> using namespace std ...
 - 【造轮子】打造一个简单的万能Excel读写工具
		
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
 
随机推荐
- FastReport.Mono添加了新的条形码ITF-14
			
FastReport.Mono 是一款为Mono Framework设计的功能全面的报表生成工具.FastReport.Mono 是一个多平台的报表解决方法.它可以应用于Windows, Linux, ...
 - 模型集成model ensemble
			
A prediction model that is composed of a set of models is called a model ensemble. Baggging 和Boostin ...
 - Java知识系统回顾整理01基础05控制流程06break
			
一.break break:结束循环 二.练习--直接结束当前for循环 public class HelloWorld { public static void main(String[] args ...
 - NMOS和PMOS区别
			
在很多电路途中会出现NMOS和PMOS管,因为不是中文那么直接,都说管压降之类的,但其实它的导通很重要以及区别,关系到你点亮电子元件> 参考: 1.https://blog.csdn.net/l ...
 - 【题解】Product
			
\(\color{brown}{Link}\) \(\text{Solution:}\) \(Question:\) \(\prod_{i=1}^n \prod_{j=1}^n \frac{lcm(i ...
 - 二进制K8S集群使用Bootstrap Token 方式增加Node
			
TLS Bootstraping:在kubernetes集群中,Node上组件kebelet和kube-proxy都需要与kube-apiserver进行通信,为了增加传输安全性,采用https方式, ...
 - MySQL 日志详解
			
一.MySQL 日志分类 MySQL 日志主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志. 错误日志: -log-err (记录启动.运行.停止 MySQL 服务时出现的信息) 查询日 ...
 - day64 Pyhton 框架Django 07
			
day67 内容回顾 视图 1. CBV 定义 from django.views import View class Addpub(View): def get(self,request): sel ...
 - BASH让标准输出和错误输出颜色不同
			
shell中运行的程序输出有标准输出(stdout)和错误输出(stderr)两种.当在终端中运行一个进程时,默认是stdout和stderr混在一起的,需要区分只能去读内容,人眼不容易快速区分. 如 ...
 - java 实体对象转Map公共类
			
java 实体对象转Map公共类 package org.kxtkx.portal.utils; import java.lang.reflect.Field; import java.util.Ha ...