题目传送门(内部题63)


输入格式

第一行有一个整数$id$,表示测试点编号。
第一行有一个整数$q$,表示询问组数。
然后有$q$行,每行有两个整数$n_i,m_i$。


输出格式

一共有$q$行,每行一个整数表示每组询问的答案$S_{n_i,m_i}$对$10^9+7$取模的结果。


样例

样例输入:

1
5
1 1
2 1
3 2
4 3
5 5

样例输出:

2
3
7
15
32


数据范围与提示

对于所有数据,$1\leqslant q,n_i,m_i\leqslant 10^5$。


题解

考场上把$80$分部分分都水全了,愣是没想到莫队……

先来考虑所有询问的$n_i$相等应该怎么办,预处理即可,考虑$S_{n,m-1}$如何转移到$S_{n,m}$,无非就是加上$C_n^m$即可,不再赘述。

现在考虑所有询问的$m_i$相等应该怎么办,显然预处理没有那么简单,考虑$S_{n-1,m}$如何转移到$S_{n,m}$,既然组合数可以用杨辉三角推得,不妨画个杨辉三角。

为方便,我现在只画出杨辉三角中的其中两行为例

设$1$号点为$n-1$行的行首,$4$号点为$n$行的行首,利用杨辉三角的性质,编号为$4$的点等于编号为$1$的点,编号为$5$的点等于编号为$1$的点和编号为$2$的点的加和,编号为$6$的点等于编号为$2$的点和编号为$3$的点的加和。

还可以发现,在从$n-1$行向$n$行转移的时候除了$3$号点以外其它点都被加了$2$次,只有$3$号点只加了$1$次,那么我们可以得出$S_{n,m}=S_{n-1,m}*2-C_{n-1}^m$,同理$S_{n-1,m}=\frac{S_{n,m}+C_{n-1}^m}{2}$。

利用这个性质我们就可以解决这个子问题了。

得出了这些性质,我们可以考虑莫队算法,$m$相当于$l$,$n$相当于$r$,这道题就解决了。

时间复杂度:$\Theta(n\sqrt{n})$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int n,m,id,pos;}e[100001];
const int mod=1000000007;
const int inx=500000004;
int q;
long long ans[100001];
long long jc[100001],inv[100001];
long long qpow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y%2)res=res*x%mod;
y>>=1;
x=x*x%mod;
}
return res;
}
void pre_work()
{
jc[0]=1;
for(long long i=1;i<=100000;i++)
jc[i]=jc[i-1]*i%mod;
inv[100000]=qpow(jc[100000],mod-2);
for(int i=100000;i;i--)
inv[i-1]=inv[i]*i%mod;
}
long long get_C(long long x,long long y){return jc[x]*inv[y]%mod*inv[x-y]%mod;}
long long lucas(long long x,long long y)
{
if(!y)return 1;
return get_C(x%mod,y%mod)*lucas(x/mod,y/mod)%mod;
}
bool cmp(rec a,rec b){return (a.pos)^(b.pos)?a.m<b.m:(((a.pos)&1)?a.n<b.n:a.n>b.n);}
int main()
{
pre_work();int mxn=0;
scanf("%d%d",&q,&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&e[i].n,&e[i].m);
mxn=max(mxn,e[i].n);e[i].id=i;
}
int t=sqrt(mxn);
for(int i=1;i<=q;i++)e[i].pos=(e[i].m-1)/t+1;
sort(e+1,e+q+1,cmp);
int m=0,n=0;
long long now=1;
for(int i=1;i<=q;i++)
{
while(n<e[i].n)now=(now*2%mod-lucas(n++,m)+mod)%mod;
while(m<e[i].m)now=(now+lucas(n,++m))%mod;
while(m>e[i].m)now=(now-lucas(n,m--)+mod)%mod;
while(n>e[i].n)now=(now+lucas(--n,m))*inx%mod;
ans[e[i].id]=now;
}
for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
return 0;
}

rp++

[CSP-S模拟测试]:sum(数学+莫队)的更多相关文章

  1. 20181009noip HZ EZ两校联考sum(莫队,组合数学)

    题面戳这里 思路: noip考莫队???!!! 考场上死活没往这方面想啊!!!数据分治忘写endl50pts滚粗了 这里每个询问都有n,m两个参数 我们可以把它看做常规莫队中的l和r 然后利用组合数的 ...

  2. NOI模拟 颜色 - 带修莫队/树套树

    题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...

  3. 联赛模拟测试12 C. sum 莫队+组合数

    题目描述 分析 \(80\) 分的暴力都打出来了还是没有想到莫队 首先对于 \(s[n][m]\) 我们可以很快地由它推到 \(s[n][m+1]\) 和 \(s[n][m-1]\) 即 \(s[n] ...

  4. [CSP-S模拟测试]:飘雪圣域(莫队)

    题目描述 $IcePrincess\text{_}1968$和$IcePrince\text{_}1968$长大了,他们开始协助国王$IceKing\text{_}1968$管理国内事物. $IceP ...

  5. [CSP-S模拟测试]:ants(回滚莫队)

    题目描述 然而贪玩的$dirty$又开始了他的第三个游戏. $dirty$抓来了$n$只蚂蚁,并且赋予每只蚂蚁不同的编号,编号从$1$到$n$.最开始,它们按某个顺序排成一列.现在$dirty$想要进 ...

  6. [CSP-S模拟测试]:蔬菜(二维莫队)

    题目描述 小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜.秋天到了,小$C$家的菜地丰收了. 小$C$拟定了$q$种采摘蔬菜的计划,计划 ...

  7. csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」

    改了两天,终于将T1,T3毒瘤题改完了... T1 施工(单调栈优化DP) 考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解 正解是很**的单调 ...

  8. 【10.11校内测试】【优先队列(反悔贪心)】【莫队】【stl的应用??离线处理+二分】

    上次做过类似的题,原来这道还要简单些?? 上次那道题是每天可以同时买进卖出,所以用两个优先队列,一个存买进,一个存卖出(供反悔的队列). 这道题实际上用一个就够了???但是不好理解!! 所以我还是用了 ...

  9. [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)

    二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...

随机推荐

  1. php-fpm启动不起来,php-fpm无法启动的一种情况

    今天碰了一个很奇怪的问题,平时好好的php-fpm修改了一个参数后,突然启动不起来了,试着把参数还原.甚至用备份的配置文件还原都没办法启动php,而且不给任务启动错误的提示,纳闷!!!后来上网找了个资 ...

  2. DevOps的前世今生

    From今日头条:https://www.toutiao.com/a6534660729453150723/?tt_from=weixin&utm_campaign=client_share& ...

  3. 解决django项目无法连接远程mysql的问题

    我们都知道django项目可以通过修改settings.py文件中的DATABASES这个对象,使用不同的数据库. 如图所示,我们想连接远程的mysql,修改settings.py的配置 然后我们在终 ...

  4. CentOS7linux系统安装fpm服务,自己制作rpm包文件

    1.安装ruby环境 [root@oldboy /]# yum install -y ruby ruby-devel rubygems gem install fpm gem sources --ad ...

  5. Java可变参数方法

    概念: jdk5.0出现的新特性.将同一个类中,多个方法名相同.参数类型相同.返回类型相同,仅仅是参数个数不同的方法抽取成一个方法,这种方法称为可变参数的方法 好处: 提高代码的重用性和维护性 语法: ...

  6. RandomAccessFile类使用说明

    RandomAccessFile类是Java Io体系中功能最为丰富的文件访问类,它提供了众多的文件访问方法.RandomAccessFile类支持“随机访问”方式,这里的“随机”是指程序可以直接跳到 ...

  7. 用命令行远程导出MySQL数据

    mysqldump -h10.10.9.197 -uroot -proot --default-character-set=utf8 0610_eshop >C:/Users/Adm inist ...

  8. free野指针问题

    gdb backtrace内容如下: Program received signal SIGABRT, Aborted. (gdb) p cmd No symbol "cmd" i ...

  9. win32 socket编程(五)——客户端实例(TCP)

    一.客户端操作流程 1.1 加载套接字库(WSAStartup()) 1.2创建套接字(socket()). 1.3向服务器发出连接请求(connect()). 对于客户端来说,它不需要绑定,可以直接 ...

  10. JavaScript基础5——动态显示时间

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...