题面

传送门:


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的更多相关文章

  1. WC2019 填坑记

    2019年1月8日 1.Luogu P2147 [SDOI2008]洞穴勘测 (LCT模板题&LCT学习) 2019年1月9日 2.LuoguP3203 [HNOI2010]弹飞绵羊  (LC ...

  2. 万圣节的糖果(Halloween Sweets)

    今天遇到codewars的一道题,这是链接,讲的是关于万圣节的一个题目,简单点说,就是9个包裹,一个天平,两次称的机会,怎么找出9个包裹中唯一一个较重的包裹. 像我这种年轻时候喜欢研究难题获得存在感的 ...

  3. BZOJ 3027 Sweets 生成函数,容斥

    Description John得到了n罐糖果.不同的糖果罐,糖果的种类不同(即同一个糖果罐里的糖果种类是相同的,不同的糖果罐里的糖果的种类是不同的).第i个糖果罐里有 mi个糖果.John决定吃掉一 ...

  4. 题解-CodeChef IOPC14L Sweets Problem

    Problem CodeChef-IOPC14L 题目概要:给定 \(n\) 种糖果且给定每种糖果的数量 \(A_i\),\(Q\) 组询问,每次问选出 \(S\) 个糖果的方案数(模\(10^9+7 ...

  5. cf1158A-The Party and Sweets - (贪心+思维)

    题意:有n个男孩,m个女孩,每个男孩给每个女孩一堆糖果.b数组表示每个男孩给出的最少糖果数,g数组表示每个女孩子收到的最大糖果数.求所有男孩给出的最小糖果总数. 解题: 先对b数组和g数组从小到大排序 ...

  6. The Party and Sweets CodeForces - 1159C (拓排)

    优化连边然后拓排. #include <iostream> #include <sstream> #include <algorithm> #include < ...

  7. Codeforces Round #600 (Div. 2) C - Sweets Eating

    #include<iostream> #include<algorithm> #include<cstring> using namespace std ; typ ...

  8. C - Sweets Eating

    规律题 前缀和+规律 先求前缀和...答案为c[i]=arr[i]+c[i-m]//i>m时. #include<bits/stdc++.h> using namespace std ...

  9. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

随机推荐

  1. 你来讲讲AQS是什么吧?都是怎么用的?

    前言 在Java面试的时候,多线程相关的知识是躲不掉的,肯定会被问.我就被问到了AQS的知识,就直接了当的问,AQS知道是什么吧,来讲讲它是怎么实现的,以及哪些地方用到了它.当时自己确实没有讲好,所以 ...

  2. 使用VS2015从TFS获取项目后编译报错

    把VS2015关闭后,打开C:\Windows\Temp,把里面的文件清空后,重新打开VS即可.

  3. sqli-labs第二关 详解

    学会了第一关,时隔多天来到了第二关,怎么说了没有看wp就给做出来了. 首先,我是自己先判断了下,这个是什么注入 ?id=1' 不行 ?id=1' or '1'='1--+ 也不行 然后又尝试了下 ?i ...

  4. CSP-S 2019 游记,以及AFO

    CSP-S:Day1 195 Day2 84 滚粗,AFO. Day0 和cyl神仙打了一会儿游戏,九点半教了cyl一下LCT,开始写板子题,写到十点半,睡觉. Day1 六点半起床.吃饭.赶赴考场, ...

  5. docker自定义网络里的dns实现原理

    简单说一下流程吧,不写了. docker会修改容器里的/etc/resolv.conf文件,把dns服务器设置成127.0.0.11,因为127.0.0.0/8地址都是本机回环地址,所以dns查询的时 ...

  6. 多测师_讲解python__004 函数

    # 函数:一个工具,随调随用# 降级代码冗余## 增加代码的复用性,提高开发效率,为了不成为cv战士## 提高程序扩展性## 函数有两个阶段:定义阶段,调用阶段.## 定义时:只检查函数体内代码语法, ...

  7. day25 Pyhton学习 约束和异常处理

    一.类的约束 约束是对类的约束 有两种方法: 1.提取一个父类,在父类中给出一个方法,并且在方法中不给出任何代码,直接抛异常 class Base: def login(self): raise Ex ...

  8. HDU-1051 Wooden Sticks--线性动归(LIS)

    题目大意:有n根木棍(n<5000),每根木棍有一个长度l和重量w(l,w<10000),现在要对这些木头进行加工,加工有以下规则: 1.你需要1分钟来准备第一根木头. 2.如果下一根木头 ...

  9. Redis Hashes 数据类型简述

    Redis Hashes 是我们日常使用中比较高频的 Redis 数据类型,内部使用 Redis 字典结构存储,底层基于哈希表结构实现. 下面从哈希表节点,哈下表结构,Redis 字典,Redis 字 ...

  10. Linux文件系统和管理-2文件操作命令(上)

    文件操作命令 文件 文件也包括目录 目录是一种特殊的文件 目录 一个目录名分成两部分 所在目录 dirname 父目录的路径 文件名 basename 本身就是两个命令 [root@C8-1 misc ...