AT987 高橋君

给出 \(n,\ k\) ,求 \(\displaystyle\sum_{i=0}^kC_n^k\) , \(T\) 次询问

\(T\leq10^5,\ 0\leq k\leq n\leq10^5\)

莫队


莫队,考虑如何将 \(\displaystyle\sum_{i=0}^kC_n^i\) 转移到 \(\displaystyle\sum_{i=0}^{k+1}C_n^i,\ \displaystyle\sum_{i=0}^{k-1}C_n^i,\ \displaystyle\sum_{i=0}^kC_{n+1}^i,\ \displaystyle\sum_{i=0}^kC_{n-1}^i\)

令 \(S=\displaystyle\sum_{i=0}^kC_n^i\)

易知 \(\displaystyle\sum_{i=0}^{k+1}C_n^i=S+C_{n}^{k+1},\ \displaystyle\sum_{i=0}^{k-1}C_n^i=S-C_n^k\)

剩下两个转移,可以考虑杨辉三角 \(C_n^m=C_{n-1}^m+C_{n-1}^{m-1}\)

\(\displaystyle\sum_{i=0}^kC_{n+1}^i=\displaystyle\sum_{i=0}^kC_n^i+\displaystyle\sum_{i=0}^{k-1}C_n^i=2\times S-C_n^k\)

\(\therefore \displaystyle\sum_{i=0}^kC_n^i=\frac{C_n^k+\displaystyle\sum_{i=0}^kC_{n+1}^i}{2}\)

\(\therefore \displaystyle\sum_{i=0}^kC_{n-1}^i=\frac{S+C_{n-1}^k}{2}\)

综上所述

\[\begin{cases}\displaystyle\sum_{i=0}^{k+1}C_n^i=S+C_n^{k+1}\\\displaystyle\sum_{i=0}^{k-1}C_n^i=S-C_n^k\\\displaystyle\sum_{i=0}^kC_{n+1}^i=2\times S-C_n^k\\\displaystyle\sum_{i=0}^kC_{n-1}^i=\frac{S+C_{n-1}^k}{2}\end{cases}
\]

然后就可以愉快地莫队辣

时间复杂度 \(O(n\sqrt n)\)

代码

#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = 1e5 + 10, P = 1e9 + 7;
int n, bl[maxn], ans[maxn];
int inv[maxn], fact[maxn], fact_inv[maxn]; struct Query {
int l, r, tid;
bool operator < (const Query& o) const {
return bl[l] == bl[o.l] ? r > o.r : l < o.l;
}
} Q[maxn]; int C(int n, int m) {
return n < m ? 0 : 1ll * fact[n] * fact_inv[m] % P * fact_inv[n - m] % P;
} int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
Q[i].tid = i;
scanf("%d %d", &Q[i].l, &Q[i].r);
}
int sz = sqrt(n);
bl[1] = inv[1] = 1;
fact[0] = fact[1] = 1;
fact_inv[0] = fact_inv[1] = 1;
for (int i = 2; i < 100001; i++) {
bl[i] = (i - 1) / sz + 1;
fact[i] = 1ll * i * fact[i - 1] % P;
inv[i] = 1ll * (P - P / i) * inv[P % i] % P;
fact_inv[i] = 1ll * inv[i] * fact_inv[i - 1] % P;
}
sort(Q + 1, Q + n + 1);
int l = 0, r = 0; ll cur = 1;
for (int i = 1; i <= n; i++) {
while (l < Q[i].l) {
cur = (cur + cur - C(l++, r) + P) % P;
}
while (l > Q[i].l) {
cur = 500000004 * (cur + C(--l, r)) % P;
}
while (r < Q[i].r) cur += C(l, ++r);
while (r > Q[i].r) cur -= C(l, r--);
cur = (cur % P + P) % P;
ans[Q[i].tid] = cur;
}
for (int i = 1; i <= n; i++) {
printf("%d\n", ans[i]);
}
return 0;
}

AT987 高橋君的更多相关文章

  1. 高橋君とホテル / Tak and Hotels

    高橋君とホテル / Tak and Hotels Time limit : 3sec / Stack limit : 256MB / Memory limit : 256MB Score : 700  ...

  2. 高橋君とカード / Tak and Cards

    高橋君とカード / Tak and Cards Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Score : 300 p ...

  3. 【AT987】高橋君

    题目 成爷爷一眼秒,\(tql!!!\) 多组询问,求 \[\sum_{i=0}^kC_{n}^i \] 发现\(k<=n\)啊,于是我们可以把一组询问抽象成一个区间\([k,n]\) 左指针的 ...

  4. 高橋君とカード / Tak and Cards AtCoder - 2037 (DP)

    Problem Statement Tak has N cards. On the i-th (1≤i≤N) card is written an integer xi. He is selectin ...

  5. AtCoder Beginner Contest 044 C - 高橋君とカード / Tak and Cards

    题目链接:http://abc044.contest.atcoder.jp/tasks/arc060_a Time limit : 2sec / Memory limit : 256MB Score ...

  6. AtCoder Beginner Contest 044 A - 高橋君とホテルイージー / Tak and Hotels (ABC Edit)

    Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement There is a hotel with ...

  7. AtCoder D - 高橋君と見えざる手 / An Invisible Hand 简单思维题

    http://arc063.contest.atcoder.jp/tasks/arc063_b 因为每次都是选取最大值,那么用dp[i]表示第i个数结尾能得到最大是多少. 其实就是用a[i]去减去左边 ...

  8. AtCoder Beginner Contest 022 A.Best Body 水题

    Best Body Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://abc022.contest.atcoder.jp/tasks/abc02 ...

  9. AtCoder-arc060 (题解)

    A - 高橋君とカード / Tak and Cards (DP) 题目链接 题目大意: 有 \(n\) 个数字,要求取出一些数字,使得它们的平均数恰好为 \(x\) ,问有几种取法. 大致思路: 只要 ...

随机推荐

  1. SAP FI配置步骤

    http://blog.sina.com.cn/s/blog_8eda1a620100uwzj.html No. 配置对象 事务代码 配置内容 路径 备注 1 定义公司 OX15 企业结构>定义 ...

  2. Ubuntu、deepin 安装 mysql

    在 Ubuntu 和 deepin 安装 mysql 是很简单的,只需要几条简单的命令即可   1. sudo apt-get install mysql-server 2. sudo apt-get ...

  3. JAVA TestNG单元测试详解

    TestNG单元测试详解   by:授客 QQ:1033553122 1. 测试环境 2 2. 介绍 2 3. Annotation 2 4. testng.xml 3 4.1. 例1 3 4.2. ...

  4. AndroBench手机性能测试

    AndroBench是一个基准测试应用程序,可以衡量你的Android设备的存储性能. AndroBench提供两种方式,第一种可以快速与其他设备的存储进行比较. 第二种 SQLite可以查询数据库表 ...

  5. LeetCode单排日记

    初衷 之前有研究过一段时间数据结构与算法,但平时使用的不多,就连排序都很少用(自从JDK8有了Stream,就再也没有手写排序了.),所谓用进废退,时至今日,能记住的已经不多了,还记得之前有一次面试, ...

  6. PostgreSQL date_trunc() 和timestamp

    timestamp 01.SELECT now()::timestamp + '1 year'; 02.SELECT now()::timestamp + '1 month'; 03.SELECT n ...

  7. NumPy的使用(一)

    # -*- coding: utf8 -*- from numpy import* a=arange(15).reshape(3,5) print a print a.shape print a.nd ...

  8. mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

    转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的 ...

  9. xtrabackup部署以及使用

    简介 备份mysql数据库一直是一个比较恶心的工作,主要就是备份的数据库比较大实在是慢.最近开始使用xtrabackup来备份数据库,速度上快了很多,尤其还原速度要快的多.下面我将从安装开始简要介绍一 ...

  10. JavaScript or JQuery 获取服务器时间

    用js做时间校正,获取本机时间,是存在bug的. 使用js也可获取到服务器时间,原理是使用 ajax请求,返回的头部信息就含有服务器端的时间信息,获取到就可以了(有的IE下扔不会正常获取,还是更建议走 ...