洛谷传送门

SPOJ传送门

题意翻译

题目描述:

John有 n n n个糖果管子。每个罐子都装有不同种类的糖果(即,同一个罐子里的糖果是同类的,而不同罐子的糖果是不同类的)。第 i i i个罐子有 m i m_i mi​个糖果。 John决定吃一些糖果,他打算至少吃 a a a个,至多吃 b b b个。求有多少种吃法。

输入格式:

第一行三个整数 n , a , b n,a,b n,a,b。 接下来 n n n行,每行一个数 m i m_i mi​,表示第 i i i个罐子里的糖果数。

( 1 ≤ n ≤ 10 , 0 ≤ a ≤ b ≤ 10000000 , 0 ≤ m i ≤ 1000000 ) (1 ≤ n ≤ 10, 0 ≤ a ≤ b ≤ 10000000,0 ≤ m_i ≤ 1000000) (1≤n≤10,0≤a≤b≤10000000,0≤mi​≤1000000).

输出格式:

输出有多少种吃法,结果 m o d 2004 mod\ 2004 mod 2004。

解题分析

首先把下界这个条件搞掉, 变成计算 1 ∼ a − 1 1\sim a-1 1∼a−1个和 1 ∼ b 1\sim b 1∼b个。

那么还是用容斥, 强制一些罐子选的数量超出限制, 然后最后用全集去减, 即可得到所有不符合条件的数量。

然后这道题因为是要选 1 ∼ n 1\sim n 1∼n个, 那么其实还用一种选法是把一些糖放在一个要不选的“罐子”里面, 因此罐子数量 + 1 +1 +1即可。

注意这里因为罐子数量很小, 我们求组合数 ( n m ) \binom{n}{m} (mn​)的时候上面的 n ! n! n!和下面的 ( n − m ) ! (n-m)! (n−m)!可以约掉很大一部分, 所以可以直接分解质因数求。

代码如下:

#pragma GCC optimize("O3")
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <iostream>
#include <algorithm>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MOD 2004
int n, a, b;
int lim[15];
IN int fpow(R int base, R int tim)
{int ret = 1;W (tim){if (tim & 1) ret = ret * base % MOD;base = base * base % MOD, tim >>= 1;}return ret;
}
IN int C(R int n, R int m)
{int cnt2 = 0, cnt3 = 0, cnt5 = 0, cnt7 = 0, buf;int ret = 1;for (R int i = 2; i <= m; ++i){buf = i;W (!(buf % 2)) ++cnt2, buf /= 2;W (!(buf % 3)) ++cnt3, buf /= 3;W (!(buf % 5)) ++cnt5, buf /= 5;W (!(buf % 7)) ++cnt7, buf /= 7;}for (R int i = n; i > n - m; --i){buf = i;W ((!(buf % 2)) && cnt2) --cnt2, buf /= 2;W ((!(buf % 3)) && cnt3) --cnt3, buf /= 3;W ((!(buf % 5)) && cnt5) --cnt5, buf /= 5;W ((!(buf % 7)) && cnt7) --cnt7, buf /= 7;ret = 1ll * ret * buf % MOD;}ret = 1ll * ret * fpow(2, cnt2) % MOD;ret = 1ll * ret * fpow(3, cnt3) % MOD;ret = 1ll * ret * fpow(5, cnt5) % MOD;ret = 1ll * ret * fpow(7, cnt7) % MOD;return ret;
}
IN int solve(R int bd)
{int all = (1 << n) - 1, typ, need, avai;int ans = 0;for (R int i = 1; i <= all; ++i){typ = __builtin_popcount(i);need = 0;for (R int j = 1; j <= n; ++j)if (i & (1 << j - 1)) need += lim[j] + 1;if (need > bd) continue;avai = bd - need;if (typ & 1) ans += C(avai + n, n);else ans -= C(avai + n, n);}return (C(n + bd, n) - ans % MOD + MOD) % MOD;
}
int main(void)
{using namespace std;ios_base::sync_with_stdio(false);cin >> n >> a >> b;for (R int i = 1; i <= n; ++i) cin >> lim[i];cout << (solve(b) - solve(a - 1) + MOD) % MOD;
}

[SP16607] IE1 - Sweets相关推荐

  1. SPOJ16607 IE1 - Sweets

    题面 传送门: 洛咕 SPOJ Solution 这题的想法挺妙的. . 首先,对于这种区间求答案的问题,我们一般都可以通过类似前缀和的思想一减来消去a,即求[a,b]的答案可以转化为求[1,b]-[ ...

  2. IE浏览器十大进化史 盘点微软IE1到IE10辉煌历程(转)

    回顾浏览器的历史长河,1995年至今微软IE浏览器已经跨域了10个版本,成为浏 览器市场的霸主,尤其Win7平台上的IE9浏览器更是无人能敌,全球使用量已经超过30%.Win8时代中,再看IE10的表 ...

  3. html在ie11乱码,IE1 0、 IE11页面中文乱码

    当我们在IE10 \ IE11浏览器中打开中文时,应以中文显示的内容显示为乱码.通常,此问题是由代码不匹配引起的.如果要正常显示,只需修改浏览器代码.您可以右键单击该页面,在右键菜单中选择" ...

  4. C. Sweets Eating

    链接:https://codeforces.com/contest/1253/problem/C Tsumugi brought nn delicious sweets to the Light Mu ...

  5. 【CodeForces 1253C --- Sweets Eating】DP

    [CodeForces 1253C --- Sweets Eating]DP Description Tsumugi brought n delicious sweets to the Light M ...

  6. CodeForces 1253 C. Sweets Eating DP

    一.内容 Tsumugi brought n delicious sweets to the Light Music Club. They are numbered from 1 to n, wher ...

  7. CodeForces 1253C Sweets Eating

    一共n个糖果,每天最多吃m个.糖果第d天吃的花费是a[i] * d 问你吃k块糖果的最小花费是多少.其实应该是一个贪心的思路.让糖果从大小排序然后求个前缀和就行了. AC代码: #include &l ...

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

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

  9. luogu P6078 [CEOI2004] Sweets(生成函数入门题)

    我的生成函数只有幼儿园水平/kk https://www.luogu.com.cn/problem/P6078 首先对于一种糖,它的生成函数可以写成这样,封闭形式就是 ∑ j = 0 m i x j ...

最新文章

  1. linux服务器的搭建配置与应用,linux服务器的搭建与配置
  2. 使用js获取页面参数
  3. 模拟便于直接存取的索引文件结构_07016.2.0使用Solr7对结构化csv文件建立全文索引...
  4. 在C#中调用另一个应用程序或命令行(.exe 带参数)zz
  5. 利用cad计算型材的弹性模量_3米高广告牌钢结构设计计算书(最后附CAD图纸)
  6. 微电子新手入门之 Origin画图
  7. win10虚拟机安装linux
  8. docker镜像指定安装源_详解如何修改docker pull镜像源
  9. 智能科学与技术与数据科学与大数据技术哪个好
  10. Cisco NAT --- 从内网用公网IP地址访问内网服务器
  11. OPENCV混合高斯模型原理
  12. Node.js 安装教程(Windows)
  13. 基于Puppeteer的Chrome Recorder初试
  14. 2020-1-31赛
  15. 真是恍然大悟啊!免费Java高级工程师学习资源,详细的Java学习指南
  16. [转] 一个iOS开发者的修真之路
  17. .qsv(爱奇艺)以及.flv(流媒体视频)视频格式转码(附转码工具)
  18. 计算4000000000以内最大的f(n)=n的值---字符串问题python实现(五)
  19. CentOS7 查看修改主机名及解析、DNS、IP、网关、网段、掩码
  20. 校园网络工程规划与设计

热门文章

  1. 用服务器传输xml文件格式,XML技术上传文件
  2. freemarker创建模板文件常用标签
  3. Android Studio中两个模拟器互发短信的解决方案
  4. Arduino 从串口接收到的数据中提取整型数据(parseInt)
  5. 解决SQL Server2017的sa用户被禁用
  6. POS调试8583报文-余额查询
  7. python简单图画程序_制作一个简单的画图小程序界面
  8. 清北毕业生2019就业去向:北大从政人数多,清华企业比例大,华为成最大赢家...
  9. solid works装配图带约束导入Adams中
  10. 总结两个平常打代码犯的“低级”错误