[CSP-S模拟测试]:sum(数学+莫队)
题目传送门(内部题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(数学+莫队)的更多相关文章
- 20181009noip HZ EZ两校联考sum(莫队,组合数学)
题面戳这里 思路: noip考莫队???!!! 考场上死活没往这方面想啊!!!数据分治忘写endl50pts滚粗了 这里每个询问都有n,m两个参数 我们可以把它看做常规莫队中的l和r 然后利用组合数的 ...
- NOI模拟 颜色 - 带修莫队/树套树
题意: 一个颜色序列,\(a_1, a_2, ...a_i\)表示第i个的颜色,给出每种颜色的美丽度\(w_i\),定义一段颜色的美丽值为该段颜色的美丽值之和(重复的只计算一次),每次都会修改某个位置 ...
- 联赛模拟测试12 C. sum 莫队+组合数
题目描述 分析 \(80\) 分的暴力都打出来了还是没有想到莫队 首先对于 \(s[n][m]\) 我们可以很快地由它推到 \(s[n][m+1]\) 和 \(s[n][m-1]\) 即 \(s[n] ...
- [CSP-S模拟测试]:飘雪圣域(莫队)
题目描述 $IcePrincess\text{_}1968$和$IcePrince\text{_}1968$长大了,他们开始协助国王$IceKing\text{_}1968$管理国内事物. $IceP ...
- [CSP-S模拟测试]:ants(回滚莫队)
题目描述 然而贪玩的$dirty$又开始了他的第三个游戏. $dirty$抓来了$n$只蚂蚁,并且赋予每只蚂蚁不同的编号,编号从$1$到$n$.最开始,它们按某个顺序排成一列.现在$dirty$想要进 ...
- [CSP-S模拟测试]:蔬菜(二维莫队)
题目描述 小$C$在家中开垦了一块菜地,可以抽象成一个$r\times c$大小的矩形区域,菜地的每个位置都种着一种蔬菜.秋天到了,小$C$家的菜地丰收了. 小$C$拟定了$q$种采摘蔬菜的计划,计划 ...
- csp-s模拟测试50(9.22)「施工(单调栈优化DP)」·「蔬菜(二维莫队???)」·「联盟(树上直径)」
改了两天,终于将T1,T3毒瘤题改完了... T1 施工(单调栈优化DP) 考场上只想到了n*hmaxn*hmaxn的DP,用线段树优化一下变成n*hmaxn*log但显然不是正解 正解是很**的单调 ...
- 【10.11校内测试】【优先队列(反悔贪心)】【莫队】【stl的应用??离线处理+二分】
上次做过类似的题,原来这道还要简单些?? 上次那道题是每天可以同时买进卖出,所以用两个优先队列,一个存买进,一个存卖出(供反悔的队列). 这道题实际上用一个就够了???但是不好理解!! 所以我还是用了 ...
- [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)
二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...
随机推荐
- Winform 开源控件库( Sheng.Winform.Controls)
升讯威 .Net WinForm 控件库提供了超过15种 Winform 控件,你可以直接使用本控件库,更可以通过本控件库学到 Winform 控件开发的方法和理念. 你可以学习到: 如何基于 Con ...
- axios 获取不到数据错误
1.问题: 打算学习下vue,但是vue-resource作者已经不更新了,并且大家都建议用axios来进行前后端交互,所以就从学习axios开始. 但是在使用 axios 的过程中,自己写的接口竟然 ...
- 【vim】vim的收藏集
[vim]vim的收藏集 刚接触vim,还木有时间专门研究一下自己的配置,所以暂时贴下网上分享的配置 2019-07-13 14:22:08 无插件的版本 https://my.oschina.net ...
- Machine Learning 文章导读
Machine Learning Algorithms Linear Regression and Gradient Descent Local Weighted Regression Algorit ...
- Java{0}占位符替换字符串
Java{0}占位符替换字符串 public class Test { public static void main(String[] args) { System.out.println(Stri ...
- iptables防火墙常用命令
iptables防火墙启动停止和基本操作 iptables是centos7之前常用的防火墙,在centos7上使用了firewall 防火墙基本操作: # 查询防火墙状态 service iptabl ...
- 小白学Python(14)——pyecharts 绘制K线图 Kline/Candlestick
Kline-基本示例 from pyecharts import options as opts from pyecharts.charts import Kline data = [ [2320.2 ...
- Eclipse的Working Set管理项目
想必大家的Eclipse里也会有这么多得工程...... 每次工作使用到的项目肯定不会太多...... 每次从这么大数量的工程当中找到自己要使用的, 必须大规模的滚动滚动条......有点不和谐了. ...
- OtterTune配置记录
0. 准备两台Ubuntu 18.04的虚拟机,安装mysql(供server-side存储调优数据用)和postgresql(供client-side存储业务数据用,这里以PostgreSQL为例. ...
- openstack stein部署手册 4. glance
# 建立数据库用户及权限 create database glance; grant all privileges on glance.* to glance@'localhost' identifi ...