题目链接:点击查看

题目大意:给出n个苹果树,每个苹果树上可以摘一个苹果,问摘不超过m个苹果有多少种方式

题目分析:首先根据题意和样例可以推出,答案就是一个组合数之和,设C(n,m)为从n个数中选m个数的方案数,再设S(n,m)为本题答案数,则有S(n,m)=C(n,0)+C(n,1)+....+C(n,m-1)+C(n,m),因为样例组数给到了1e5,所以我们肯定不能暴力去计算每一个值n的答案,于是这个题目就需要离线处理,又因为题目中的m一定小于等于n,所以我们不妨将n和m视为区间,则[n,m]就可以视为[l,r]了,很自然的就转换成了莫队问题。现在我们的问题就是要解决add函数和del函数,但这个题目比较特殊,我们先一步一步来推一下。通过上面答案S(n,m)的定义式,不难看出递推式就是S(n,m)=S(n,m-1)+C(n,m),这是其中的一个条件,再就是根据杨辉三角形可以得出组合数的递推公式之二C(n,m)=C(n-1,m-1)+C(n-1,m),那么答案继续对答案S(n,m)的定义式变形:

S(n,m)

=C(n,0)+C(n,1)+....+C(n,m-1)+C(n,m)

=[0+C(n-1,0)]+[C(n-1,0)+C(n-1,1)]+..+[C(n-1,m-2)+C(n-1,m-1)]+[C(n-1,m-1)+C(n-1,m)]

=2*S(n-1,m)-C(n-1,m)

到此为止,现在我们可以整理出四个递推式了:

  1. S(n,m)=S(n,m-1)+C(n,m)
  2. S(n,m)=S(n,m+1)-C(n,m+1)
  3. S(n,m)=2*S(n-1,m)-C(n-1,m)
  4. S(n,m)=(S(n+1,m)+C(n,m))/2

根据初始的两个递推式和答案的定义式,就可以推出上面四个关键的公式了

然后再根据组合数的公式:,可以预处理出所有的阶乘和阶乘的逆元,然后O(1)求出每个组合数了


这里稍微补充一个知识,我们都知道阶乘可以O(n)的时间通过递推式fac[i]=fac[i-1]*i来推出,其实在数论中阶乘的逆元也是可以同归递推式inv[i]=inv[i+1]*(i+1)来推出的,稍微证明一下:

我们设的逆元表示为,现在我们要求的逆元,我们可以考虑将乘上一个变为

则根据前提满足关系:

得证inv[i]=inv[i+1]*(i+1)


预处理完上面的东西后,再根据公式改写一下莫队的模板就好了,还有需要注意的几个地方是:

  1. 答案记得开long long
  2. 初始化的l为0,r为1,sum为C(l,r)=C(1,0)=1
  3. fac[0]与inv[0]初始化为1,因为在计算组合数时当n==m的时候会出现除以(n-m)!也就是0!
  4. 在运算过程中若出现减法之前需要先加mod再作差,不然可能会在过程中出错(养成良好的习惯)
  5. 求逆元直接用费马小定理求就行了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;const int mod=1e9+7;int size,m;LL ans[N],fac[N],inv[N];struct query
{int l,r,id;bool operator<(const query& a)const{if(l/size!=a.l/size)return l<a.l;else if((l/size)&1)return r<a.r;elsereturn r>a.r;}
}q[N];LL q_pow(LL a,LL b)
{LL ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}LL C(int n,int m)//求组合数,n个里面选m个
{if(n<m)return 0;return fac[n]*inv[m]%mod*inv[n-m]%mod;
}void solve()
{int l=0,r=1;LL sum=1;for(int i=1;i<=m;i++){int ql=q[i].l;int qr=q[i].r;while(l<ql)//日常模一模防爆sum=(sum+C(r,++l))%mod;while(l>ql)sum=(sum+mod-C(r,l--))%mod;while(r<qr)sum=(sum*2%mod+mod-C(r++,l))%mod;while(r>qr)sum=(sum+C(--r,l))%mod*inv[2]%mod; ans[q[i].id]=sum;}
}void init()
{size=sqrt(1e5);fac[0]=1;for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%mod;inv[N-1]=q_pow(fac[N-1],mod-2);for(int i=N-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);init();scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d",&q[i].r,&q[i].l);q[i].id=i;}sort(q+1,q+1+m);solve();for(int i=1;i<=m;i++)printf("%lld\n",ans[i]);return 0;
}

HDU - 6333 Problem B. Harvest of Apples(莫队变形+思维+组合数学,好题)相关推荐

  1. HDU 6333 Problem B. Harvest of Apples(莫队离线)

    Problem B. Harvest of Apples(莫队离线) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/26214 ...

  2. [HDU](6333)Problem B. Harvest of Apples ---- 数论+莫队算法

    Problem Description There are n apples on a tree, numbered from 1 to n. Count the number of ways to ...

  3. 杭电多校 Harvest of Apples 莫队

    问题 B: Harvest of Apples 时间限制: 1 Sec  内存限制: 128 MB 提交: 78  解决: 35 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Th ...

  4. [数据结构专训][GXOI/GZOI2019]旧词,[hdu5118]GRE Words Once More!,[hdu6333]Problem B. Harvest of Apples

    文章目录 T1:[GXOI/GZOI2019]旧词 solution code T2:GRE Words Once More! solution code T3:Problem B. Harvest ...

  5. *【HDU - 6333】Problem B. Harvest of Apples (莫队,逆元,组合数学)(这样预处理正确吗?)

    题干: There are nn apples on a tree, numbered from 11 to nn.  Count the number of ways to pick at most ...

  6. Problem B. Harvest of Apples

    http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意:求c(n,0)到c(n,m)的和t组数据 每次累加一定会超时 得到公式s(n,m)=s(n-1,m) ...

  7. 计算C(n,0)+C(n,1)+...+C(n,m)--Problem B. Harvest of Apples

    http://acm.hdu.edu.cn/showproblem.php?pid=6333 四个while的顺序不能变,不知道为什么 #include<bits/stdc++.h> us ...

  8. hdu 5213(容斥原理+莫队算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5213 莫队算法是离线处理一类区间不修改查询类问题的算法.就是如果你知道了[L,R]的答案.你可以在O( ...

  9. BZOJ 1878: [SDOI2009]HH的项链 | 莫队

    题解: http://www.lydsy.com/JudgeOnline/problem.php?id=1878 题解: 莫队板子题 核心思想是对区间的询问离线之后按照合理的顺序来优化复杂度 一般的做 ...

最新文章

  1. 语文教学中如何运用计算机辅助教学,计算机辅助教学在语文教学过程中的运用...
  2. STL的deque容器
  3. 三层架构介绍和MVC设计模型介绍
  4. ChaiNext:多空胶着
  5. 导航属性没有被赋值_excel编程系列基础:操作对象RANDE的属性介绍
  6. linux 安装servlet环境_linux下一键搭建LAMP环境安装网站全教程
  7. 机器学习实战之Logistic回归
  8. dede 调用四级导航
  9. apex创建快捷方式_盖伦下载的Origin平台、Apex游戏手动添加快捷方式
  10. poi ppt 作者属性 修改_POI之PPT文本框生成及样式设置实例
  11. 计算机折线图教程,excel怎么插入折线图 excel怎么将多个折线图合并
  12. win10以太网dns服务器未响应,Win10系统dns服务器未响应如何修复?
  13. 泰禾智能:智能改变未来,成就工业设备行业佼佼者
  14. week10 day1 JavaScript
  15. mui.fire运用
  16. 联合概率数据关联JPDAF详解
  17. 关于 GK盘,扩盘在storage和os两侧的联系
  18. TCL双引号 花括号 中括号
  19. pikachu上的密码口令暴力破解
  20. 凤凰网读书频道源代码泄露漏洞

热门文章

  1. MySQL高级 - InnoDB特性
  2. 序列化的高阶认识-简单认识一下 Java 原生序列化
  3. mybatis-物理翻页
  4. 为什么需要动态SQL?
  5. 缓存-SpringCache-整合体验@Cacheable
  6. 登录业务介绍(单点登录)
  7. SOA理论与概念深入剖析
  8. log4j2 异步日志
  9. ServletContext_功能_获取MIME类型
  10. 创建provider服务