HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))
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++)。
大体就这些,其他的就是关于组合数求解的东西了,这些代码里注释了。
代码:
- //1002-6333-组合数C(n,0)到C(n,m)求和-组合数学+莫队
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<bitset>
- #include<cassert>
- #include<cctype>
- #include<cmath>
- #include<cstdlib>
- #include<ctime>
- #include<deque>
- #include<iomanip>
- #include<list>
- #include<map>
- #include<queue>
- #include<set>
- #include<stack>
- #include<vector>
- using namespace std;
- typedef long long ll;
- const double PI=acos(-1.0);
- const double eps=1e-;
- const ll mod=1e9+;
- const int inf=0x3f3f3f3f;
- const int maxn=1e5+;
- #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
- int pos[maxn];
- ll inv[maxn],f[maxn],ans[maxn];
- struct node{
- int n,m,id;
- bool operator <(const node &a) const{
- if(pos[n]!=pos[a.n]) return n<a.n;
- return m<a.m;
- }
- }que[maxn];
- /*
- 关于逆元
- 费马小定理:对于a和素数p,a^(p-1)恒等于1。
- 逆元的定义:对于正整数a和m,如果有a*x恒等于1,那么把这个同余方程中x的最小正整数解叫做a模m的逆元。一般用欧几里得扩展来做:ax+by=1;称a和b互为逆元
- a^(p−1)=a^(p−2)∗a,所以有a^(p−2)∗a%p≡1,对比逆元的定义可得,a^(p−2)是a的逆元
- 所以组合数预处理------>阶乘逆元,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,就酱~
- */
- ll qpow(ll a,ll b)//快速幂a^b%mod
- {
- ll res=;
- while(b){
- if(b&) res=(res*a)%mod;
- a=(a*a)%mod;
- b>>=;
- }
- return res;
- }
- void init()
- {
- f[]=;
- for(int i=;i<maxn;i++)//预处理出来i!%mod,就是c(n,m)中n!%mod先预处理
- f[i]=(f[i-]*i)%mod;
- for(int i=;i<maxn;i++)
- inv[i]=qpow(f[i],mod-);//inv中存的是逆元为a^(p-2)
- }
- ll C(int n,int m)//求C(n,m)
- {
- if(n<||m<||m>n) return ;
- if(m==||m==n) return ;
- return f[n]*inv[n-m]%mod*inv[m]%mod;//就是A*B%mod*C%mod
- }
- ll res=;
- int main()
- {
- init();
- int T;
- scanf("%d",&T);
- int block=(int)sqrt(maxn);
- for(int i=;i<=maxn-;i++)
- pos[i]=(i-)/block;
- for(int i=;i<=T;i++){
- scanf("%d%d",&que[i].n,&que[i].m);
- que[i].id=i;
- }
- sort(que+,que++T);
- int N=,M=;
- for(int i=;i<=T;i++){
- while(N<que[i].n) res=(*res-C(N++,M)+mod)%mod;
- while(N>que[i].n) res=((res+C(--N,M))*inv[])%mod;
- while(M<que[i].m) res=(res+C(N,++M))%mod;
- while(M>que[i].m) res=(res-C(N,M--)+mod)%mod;
- ans[que[i].id]=res;
- }
- for(int i=;i<=T;i++){
- printf("%lld\n",ans[i]);
- }
- return ;
- }
HDU 6333.Problem B. Harvest of Apples-组合数C(n,0)到C(n,m)求和-组合数学(逆元)+莫队 ((2018 Multi-University Training Contest 4 1002))的更多相关文章
- 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 ...
- 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)).有公 ...
- 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 ...
- 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) 设 ...
- 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 ...
- 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数值范围太 ...
- 【魔改】莫队算法+组合数公式 杭电多校赛4 Problem B. Harvest of Apples
http://acm.hdu.edu.cn/showproblem.php?pid=6333 莫队算法是一个离线区间分块瞎搞算法,只要满足:1.离线 2.可以O(1)从区间(L,R)更新到(L±1, ...
- 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 ...
- 热身训练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( ...
随机推荐
- input只改变光标的颜色 不改变字的颜色
color: red; text-shadow: 0px 0px 0px #000; -webkit-text-fill-color: transparent;把这些放到input里文字通过阴影实现 ...
- BZOJ4481 JSOI2015非诚勿扰(概率期望+树状数组)
首先求出每个女性接受某个男性的概率.这个概率显然是一个无穷等比数列求和. 然后按编号从小到大考虑每个女性,维护出每个男性被选择的期望次数,BIT上查询后缀和即可. 需要long double. #in ...
- hdu 3357 Stock Chase (图论froyd变形)
Stock Chase Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4776 Ants(Trie+优先队列)
Ants Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others) Total S ...
- 洛谷P1522 牛的旅行 Cow Tours
---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...
- poj 2104 (划分树模板)
Description You are working for Macrohard company in data structures department. After failing your ...
- Javascript 的addEventListener()及attachEvent()区别分析
大家都知道事件的用法就是当某个事件(状况)被触发了之后就会去执行某个Function, 尤其是Javascript, 在当红AJAX的催化下, 了解Javascript的Event用法更加重要, 在这 ...
- ES6学习笔记(一)——Promise
Promise 是 ES6 提供的一种异步编程的解决方案: 将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数(解决异步函数回调地狱的问题).Promise 对象保存着异步操作的结果. 首先 ...
- L2-001. 紧急救援---(Dijkstra,记录路径)
https://www.patest.cn/contests/gplt/L2-001 L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 ...
- 数据结构基础---Binary Search Tree
/// Binary Search Tree - Implemenation in C++ /// Simple program to create a BST of integers and sea ...