2018 Multi-University Training Contest 4

6333.Problem B. Harvest of Apples

题意很好懂,就是组合数求和

官方题解:

我来叨叨一些东西。

这题肯定不能一个一个遍历求和,这样就上天了。。。

解释一下官方题解的意思。

为什么 sum(n,m)=2*sum(n-1,m)-c(n-1,m)。

因为c(n,m)=c(n-1,m)+c(n-1,m-1),至于为什么成立,不懂的百度一下组合数和杨辉三角吧。。。

sum(n,m)=c(n,0)+c(n-1,1)+c(n-1,0)+c(n-1,2)+c(n-1,1)+...+c(n-1,m)+c(n-1,m-1)//因为c(n,0)=c(n-1,0)==1

     =c(n-1,0)+c(n-1,0)+c(n-1,1)+c(n-1,1)+c(n-1,2)+c(n-1,2)+...+c(n-1,m-1)+c(n-1,m-1)+c(n-1,m)

    =2*sum(n-1,m)-c(n-1,m)

OK,解释完了,然后怎么做呢?

通过上面推出来的公式,我们就可以在O(1)的复杂度里由推出。这个就可以用莫队写了。

关于莫队,具体的去看别人的博客,人家写的很好,我语文不好+懒,不想写。。。

要注意莫队的时候,while里的判断条件是当前指针对应的值与要求得的数的大小的关系,while(N<que[i].n) res=(2*res-C(N++,M)+mod)%mod;就假设,我当前的指针对应的值为sum(n-1,m),我需要得到的结果为sum(n,m),当前的N为n-1,所以我需要用公式sum(n,m)=2*sum(n-1,m)-c(n-1,m),经过这个操作,N就变成n了(因为N++)。

大体就这些,其他的就是关于组合数求解的东西了,这些代码里注释了。

代码:

  1. //1002-6333-组合数C(n,0)到C(n,m)求和-组合数学+莫队
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<bitset>
  7. #include<cassert>
  8. #include<cctype>
  9. #include<cmath>
  10. #include<cstdlib>
  11. #include<ctime>
  12. #include<deque>
  13. #include<iomanip>
  14. #include<list>
  15. #include<map>
  16. #include<queue>
  17. #include<set>
  18. #include<stack>
  19. #include<vector>
  20. using namespace std;
  21. typedef long long ll;
  22.  
  23. const double PI=acos(-1.0);
  24. const double eps=1e-;
  25. const ll mod=1e9+;
  26. const int inf=0x3f3f3f3f;
  27. const int maxn=1e5+;
  28. #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  29.  
  30. int pos[maxn];
  31. ll inv[maxn],f[maxn],ans[maxn];
  32.  
  33. struct node{
  34. int n,m,id;
  35.  
  36. bool operator <(const node &a) const{
  37. if(pos[n]!=pos[a.n]) return n<a.n;
  38. return m<a.m;
  39. }
  40.  
  41. }que[maxn];
  42. /*
  43. 关于逆元
  44. 费马小定理:对于a和素数p,a^(p-1)恒等于1。
  45. 逆元的定义:对于正整数a和m,如果有a*x恒等于1,那么把这个同余方程中x的最小正整数解叫做a模m的逆元。一般用欧几里得扩展来做:ax+by=1;称a和b互为逆元
  46. a^(p−1)=a^(p−2)∗a,所以有a^(p−2)∗a%p≡1,对比逆元的定义可得,a^(p−2)是a的逆元
  47. 所以组合数预处理------>阶乘逆元,n!%mod/[(n-m)!%mod*m!%mod],设n!%mod为A,(n-m)!%mod的逆元为B,m!%mod的逆元为C,所以组合数c(n,m)%mod=A*B%mod*C%mod,就酱~
  48. */
  49. ll qpow(ll a,ll b)//快速幂a^b%mod
  50. {
  51. ll res=;
  52. while(b){
  53. if(b&) res=(res*a)%mod;
  54. a=(a*a)%mod;
  55. b>>=;
  56. }
  57. return res;
  58. }
  59.  
  60. void init()
  61. {
  62. f[]=;
  63. for(int i=;i<maxn;i++)//预处理出来i!%mod,就是c(n,m)中n!%mod先预处理
  64. f[i]=(f[i-]*i)%mod;
  65. for(int i=;i<maxn;i++)
  66. inv[i]=qpow(f[i],mod-);//inv中存的是逆元为a^(p-2)
  67. }
  68.  
  69. ll C(int n,int m)//求C(n,m)
  70. {
  71. if(n<||m<||m>n) return ;
  72. if(m==||m==n) return ;
  73. return f[n]*inv[n-m]%mod*inv[m]%mod;//就是A*B%mod*C%mod
  74. }
  75.  
  76. ll res=;
  77.  
  78. int main()
  79. {
  80. init();
  81. int T;
  82. scanf("%d",&T);
  83. int block=(int)sqrt(maxn);
  84. for(int i=;i<=maxn-;i++)
  85. pos[i]=(i-)/block;
  86. for(int i=;i<=T;i++){
  87. scanf("%d%d",&que[i].n,&que[i].m);
  88. que[i].id=i;
  89. }
  90. sort(que+,que++T);
  91. int N=,M=;
  92. for(int i=;i<=T;i++){
  93. while(N<que[i].n) res=(*res-C(N++,M)+mod)%mod;
  94. while(N>que[i].n) res=((res+C(--N,M))*inv[])%mod;
  95. while(M<que[i].m) res=(res+C(N,++M))%mod;
  96. while(M>que[i].m) res=(res-C(N,M--)+mod)%mod;
  97. ans[que[i].id]=res;
  98. }
  99. for(int i=;i<=T;i++){
  100. printf("%lld\n",ans[i]);
  101. }
  102. return ;
  103. }

HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))的更多相关文章

  1. 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 mm a ...

  2. HDU - 6333 Problem B. Harvest of Apples (莫队+组合数学)

    题意:计算C(n,0)到C(n,m)的和,T(T<=1e5)组数据. 分析:预处理出阶乘和其逆元.但如果每次O(m)累加,那么会超时. 定义 S(n, m) = sigma(C(n,m)).有公 ...

  3. 2018 Multi-University Training Contest 4 Problem B. Harvest of Apples 【莫队+排列组合+逆元预处理技巧】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6333 Problem B. Harvest of Apples Time Limit: 4000/200 ...

  4. hdu6333 Problem B. Harvest of Apples(组合数+莫队)

    hdu6333 Problem B. Harvest of Apples 题目传送门 题意: 求(0,n)~(m,n)组合数之和 题解: C(n,m)=C(n-1,m-1)+C(n-1,m)    设 ...

  5. Problem B. Harvest of Apples HDU - 6333(莫队)

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

  6. Problem B. Harvest of Apples(杭电2018年多校+组合数+逆元+莫队)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6333 题目: 题意:求C(n,0)+C(n,1)+……+C(n,m)的值. 思路:由于t和n数值范围太 ...

  7. 【魔改】莫队算法+组合数公式 杭电多校赛4 Problem B. Harvest of Apples

    http://acm.hdu.edu.cn/showproblem.php?pid=6333 莫队算法是一个离线区间分块瞎搞算法,只要满足:1.离线  2.可以O(1)从区间(L,R)更新到(L±1, ...

  8. 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 p ...

  9. 热身训练1 Problem B. Harvest of Apples

    http://acm.hdu.edu.cn/showproblem.php?pid=6333 题意: 求 C(0,n)+C(1,n)+...+C(m,n) 分析: 这道题,我们令s(m,n) = C( ...

随机推荐

  1. input只改变光标的颜色 不改变字的颜色

    color: red; text-shadow: 0px 0px 0px #000; -webkit-text-fill-color: transparent;把这些放到input里文字通过阴影实现 ...

  2. BZOJ4481 JSOI2015非诚勿扰(概率期望+树状数组)

    首先求出每个女性接受某个男性的概率.这个概率显然是一个无穷等比数列求和. 然后按编号从小到大考虑每个女性,维护出每个男性被选择的期望次数,BIT上查询后缀和即可. 需要long double. #in ...

  3. hdu 3357 Stock Chase (图论froyd变形)

    Stock Chase Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU 4776 Ants(Trie+优先队列)

    Ants Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others) Total S ...

  5. 洛谷P1522 牛的旅行 Cow Tours

    ---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...

  6. poj 2104 (划分树模板)

    Description You are working for Macrohard company in data structures department. After failing your ...

  7. Javascript 的addEventListener()及attachEvent()区别分析

    大家都知道事件的用法就是当某个事件(状况)被触发了之后就会去执行某个Function, 尤其是Javascript, 在当红AJAX的催化下, 了解Javascript的Event用法更加重要, 在这 ...

  8. ES6学习笔记(一)——Promise

    Promise 是 ES6 提供的一种异步编程的解决方案: 将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数(解决异步函数回调地狱的问题).Promise 对象保存着异步操作的结果. 首先 ...

  9. L2-001. 紧急救援---(Dijkstra,记录路径)

    https://www.patest.cn/contests/gplt/L2-001 L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 ...

  10. 数据结构基础---Binary Search Tree

    /// Binary Search Tree - Implemenation in C++ /// Simple program to create a BST of integers and sea ...