@

目录

HDU6333:传送门

题意:求组合数前m项的和。

在线分块or离线莫队

分块

重要的一个定理:

\[C_{n}^{m} = 0\;\;m > n
\]

\[C_{n}^{m} = C_{a}^{0}\times C_{b}^{m}+C_{a}^{1}\times C_{b}^{m-1}...+C_{a}^{m}\times C_{b}^{0}\;\;\;a+b = n
\]

\[ans = \sum_{i=0}^m C_n^i=\sum_{i=0}^m(C_a^i\times \sum_{j=0}^{m-i} C_b^j)\;\;a+b=n
\]

然后分块处理,b为整块的大小,块内枚举i求解。

#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define all(x) (x).begin(),(x).end()
#define mme(a,b) memset((a),(b),sizeof((a)))
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int MXN = 1e5 + 7;
const int MXE = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const LL MOD = 1e9 + 7;
const LL mod = 1e9 + 7; int n;
LL l, r; const int MX = 1e5 + 7;
LL F[MX], invF[MX];
LL ksm(LL a, LL b){
LL res = 1;
for(;b;b>>=1,a=a*a%mod){
if(b&1)res = res * a % mod;
}
return res;
}
void init() {
F[0] = 1;
for (int i = 1; i < MX; i++) F[i] = F[i - 1] * i % mod;
invF[MX - 1] = ksm(F[MX - 1], mod - 2);
for (int i = MX - 2; i >= 0; i--) invF[i] = invF[i + 1] * (i + 1) % mod;
}
LL COMB(int n, int m) {
if(n == m)return 1;
if(n < m) return 0;
return F[n]*invF[m]%mod*invF[n-m]%mod;
} LL bpre[505][MXN];//bpre[i][j] = sigma(COMB(500*i,k)), k从[0, j]
int blocks = 500;
void yuchuli(){
for(int i = 1; i < MXN/blocks; ++i){
for(int j = 0; j < MXN; ++j){
if(j==0)bpre[i][j] = COMB(blocks*i, j);
else bpre[i][j] = (bpre[i][j-1] + COMB(blocks*i, j))%MOD;
}
}
} int main(int argc, char const *argv[]){
#ifndef ONLINE_JUDGE
freopen("E://ADpan//in.in", "r", stdin);
//freopen("E://ADpan//out.out", "w", stdout);
#endif
init();
yuchuli();
int tim = 1;
scanf("%d", &tim);
while(tim--){
scanf("%lld%lld", &r, &l);
LL p = r/blocks, re = r - p * blocks, ans = 0;
LL tmp = min(l, re), limit = p*500;
//printf("%lld %lld\n", p, re);
if(p == 0) p = 1, limit = 0;
for(int i = 0; i <= tmp; ++i){
ans = (ans + COMB(re, i)*bpre[p][min(l-i, limit)])%MOD;
}
printf("%lld\n", ans);
}
return 0;
}

莫队

\(S_n^m=\sum C_n^m=Cn^0+Cn^1...+Cn^m\)

\(S_n^{m-1}=\sum C_n^{m-1}=Cn^0+Cn^1...+Cn^{m-1}=S_n^m-C_n^m\)

\(S_n^{m+1}=\sum C_n^{m+1}=Cn^0+Cn^1...+Cn^{m+1}=S_n^m+C_n^{m+1}\)

\(S_{n-1}^m=\sum C_{n-1}^m=C_{n-1}^0+C_{n-1}^1...+C_{n-1}^m=(S_n^m+C_{n-1}^m)\div 2\)

\(S_{n+1}^m=\sum C_{n+1}^m=C_{n+1}^0+C_{n+1}^1...+C_{n+1}^m
=C_{n}^0+(C_{n}^0+C_n^1)+...+(C_n^{m-1}+C_n^m)
=2\times S_n^m-C_n^m\)

若已知S(m,n),则可在O(1)的时间内得到S(m-1,n),S(m+1,n),S(m,n-1),S(m,n+1),莫队即可。

#include<bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define lowbit(x) (x&(-(x)))
#define mme(a,b) memset((a),(b),sizeof((a)))
#define test printf("**-**\n")
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int MXN = 2e5 + 7;
const int MXE = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7; int n; const int MX = 1e5 + 5;
LL F[MX], invF[MX];
LL ksm(LL a, LL b){
LL res = 1;
for(;b;b>>=1,a=a*a%mod){
if(b&1)res = res * a % mod;
}
return res;
}
void init() {
F[0] = 1;
for (int i = 1; i < MX; i++) F[i] = F[i - 1] * i % mod;
invF[MX - 1] = ksm(F[MX - 1], mod - 2);
for (int i = MX - 2; i >= 0; --i) invF[i] = invF[i + 1] * (i + 1) % mod;
}
LL COMB(LL n, LL m) {
if(n == m)return 1;
if(n < m) return 0;
return F[n]*invF[m]%mod*invF[n-m]%mod;
} struct lp{
int l, r, id;
}cw[MX];
int belong[MX];
LL ans, Ans[MX];
bool cmp(lp &a,lp &b){
if(belong[a.l]!=belong[b.l])return belong[a.l]<belong[b.l];
return a.r<b.r;
} int main(){
#ifndef ONLINE_JUDGE
freopen("E://ADpan//in.in", "r", stdin);
//freopen("E://ADpan//out.out", "w", stdout);
#endif
init();
scanf("%d", &n);
int block = sqrt(MX*1.0);
for(int i = 1; i < MX; ++i)belong[i] = (i-1)/block;
for(int i = 1; i <= n; ++i){
scanf("%d%d", &cw[i].r, &cw[i].l);
cw[i].id = i;
}
sort(cw+1,cw+n+1,cmp);
int L = 1, R = 0;
ans = 1LL;
LL two = ksm(2LL, mod-2);
for(int i = 1; i <= n; ++i){
while(R<cw[i].r)ans = ((ans * 2LL - COMB(R++, L))%mod+mod)%mod ;
while(R>cw[i].r)ans = (ans + COMB(--R, L))*two%mod ;
while(L<cw[i].l)ans = (ans + COMB(R,++L))%mod ;
while(L>cw[i].l)ans = (ans - COMB(R,L--) + mod)%mod ;
Ans[cw[i].id] = ans;
}
for(int i = 1; i <= n; ++i){
printf("%lld\n", Ans[i]);
}
return 0;
}

HDU6333 求组合数前m项的和的更多相关文章

  1. POJ 2478 Farey Sequence(欧拉函数前n项和)

    A - Farey Sequence Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  2. 39. 求分数序列前N项和

    求分数序列前N项和 #include <stdio.h> int main() { int i, n; double numerator, denominator, item, sum, ...

  3. 20. 求阶乘序列前N项和

    求阶乘序列前N项和 #include <stdio.h> double fact(int n); int main() { int i, n; double item, sum; whil ...

  4. 19. 求平方根序列前N项和

    求平方根序列前N项和 #include <stdio.h> #include <math.h> int main() { int i, n; double item, sum; ...

  5. 18. 求交错序列前N项和

    求交错序列前N项和 #include <stdio.h> int main() { int numerator, denominator, flag, i, n; double item, ...

  6. 12. 求简单交错序列前N项和

    求简单交错序列前N项和 #include <stdio.h> int main() { int denominator, flag, i, n; double item, sum; whi ...

  7. 11. 求奇数分之一序列前N项和

    求奇数分之一序列前N项和 #include <stdio.h> int main() { int denominator, i, n; double item, sum; while (s ...

  8. 10. 求N分之一序列前N项和

    求N分之一序列前N项和 #include <stdio.h> int main() { int i, n; double item, sum; while (scanf("%d& ...

  9. 递归函数练习:输出菲波拉契(Fibonacci)数列的前N项数据

    /*====================================================================== 著名的菲波拉契(Fibonacci)数列,其第一项为0 ...

随机推荐

  1. Jetson Nano系列教程3:GPIO

    摘要: JetsonTX1,TX2,AGXXavier和Nano开发板包含一个40引脚的GPIO头,类似于Raspberry PI中的40引脚头.这些GPO可以通过JetsonGPIOLibrary包 ...

  2. Python每日一题 006

    题目 你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小. 如果只是单纯的通过将图片缩放到iPhone5分辨率大小,显然最后呈现出来的效果会很糟糕.所以等比例缩放到长( ...

  3. BZOJ 2839: 集合计数(二项式反演)

    传送门 解题思路 设\(f(k)\)为交集元素个数为\(k\)的方案数.发现我们并不能直接求出\(f(k)\),就考虑容斥之类的东西,容斥首先要扩大限制,再设\(g(k)\)表示至少有\(k\)个交集 ...

  4. kvm无人值守安装centos6

    nginx配置 server { listen default_server; server_name _; root /home/iso; # Load configuration files fo ...

  5. javascript全量匹配屏蔽词

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. javscript 实现iframe加载内容页出现LOADING效果

    <div id="load" align="center"> <img src="http://sc.cnwebshow.com/u ...

  7. HTML5: HTML5 内联 SVG

    ylbtech-HTML5: HTML5 内联 SVG 1.返回顶部 1. HTML5 内联 SVG HTML5 支持内联 SVG. 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Ve ...

  8. 64位系统sql链接oracle

    在SQL Server 2008中连接Oracle,完成查询.插入操作 建立指向Oracle的连接 在32位的系统中sql链接oracle,在链接服务器里点击服务器对象,右键链接服务器,选择micro ...

  9. AWS使用教程

    AWS使用教程 一.注册登录(https://portal.aws.amazon.com/billing/signup) 准备资料:信用卡(visa卡).电子邮箱.手机号 1.填写账号名和密码 2.填 ...

  10. 转 jmeter 关联

    jmeter(十二)关联之正则表达式提取器   如果有这样的情况:一个完整的操作流程,需要先完成某个操作,获得某个值或数据信息,然后才能进行下一步的操作(也就是常说的关联/将上一个请求的响应结果作为下 ...