绝对是全网写的最详细的一篇题解(因为我弱) 

  题目:序列统计  代码难度:简单  思维难度:提高+—省选

  讲下题面:给定三个正整数N、L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。输出答案对10^6+3取模的结果。

  。。。    防

  。。。    蒯

  。。。    神

  。。。    器

  好了,把我的做题思路说说。

  首先我们可以看出,L和R的具体值是没有卵用的,你只需要知道它们的差+1,记为m。同时T<=100也意味着各组询问之间应该并没有关系。

  然后我们会想到,这肯定不能一步出解(事实证明我被打脸了)。然后我们来找,对于条件(i,m),它的解是怎么来的。

  长度为i,备选数的值域(下面就叫做值数)有m个的单调不下降序列有多少个呢?

  这么一想不是很好想出来。那么我们想,如果把相同的数归入一个集合,或者叫抽屉,给它们以里面的数的代数值为编号,这个序列就可以看成一段段连续的抽屉,且它们的编号成递增。

  问题是不是可以抽象成:我有m个有编号的抽屉,要把i个相同的苹果放进去,问有多少种方法?

  此时问题已经渐渐清晰成具体模型了,但对于有些人(such as me)来说还是很玄学。于是我们再看看。

  上面那个问题下,抽屉是不动物体。现在我们把苹果当成不动物体看看:

  有i个苹果,要把它们分成至多m个区间,有多少种方法?

  这个时候千万不要想复杂了。对于这个问题,如果我们不局限于单个的i和m,而是把它们巧妙转化,整合在一起的话——

  有i个苹果,m-1个挡板。我们要在苹果中间插入挡板(也可以是最两侧),有多少种方法?

  换言之——

  有m+i-1个位子,你要在里面放m-1个挡板,有多少种放法?

  那么就是显然的组合数学!C(i+m-1,m-1)!

  那么我们知道(i,m)的答案就是C(i+m-1,m-1)。

  那么答案就是sigma(i from 1 to n)C(i+m-1,m-1);

  然而这是会T的复杂度。我们画出杨辉三角(或者根本不用画),就能发现它是在三角上的一条向左下倾斜的线。那么优化就顺(sang)理(xin)成(bing)章(kuang)了:

  在右上角加一个C(m,m),根据杨辉三角的特点,我们可以一路消掉,一直到C(N+M,M);

  因为我们之前加上了C(M,M),所以答案要减一。Ans=C(N+M,M)-1;正面肛Lucas定理。

  介绍一下Lucas定理:C(N,M)%P=Lucas(N,M,P)=C(N%P,M%P)*Lucas(N/P,M/P,P);

  逆元和阶乘预处理一下就好了。

  

#include    <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#define LL long long int
#define ls (x << 1)
#define rs (x << 1 | 1)
#define MID int mid=(l+r)>>1
using namespace std;
const LL Mod = 1000003;
LL cmod[Mod],A[Mod],J[Mod],n,m;
LL gi()
{
LL x=0,res=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')res*=-1;ch=getchar();}
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*res;
}
LL C(LL N,LL M,LL P)
{
if(M>N)return 0ll;
LL ans=J[N];
ans=ans*A[J[N-M]]%P;
ans=ans*A[J[M]]%P;
return ans;
}
LL Lucas(LL N,LL M,LL P)
{
if(M==0)return 1ll;
if(N<P&&M<P)return C(N,M,P);
LL c=C(N%P,M%P,P); if(!c)return 0ll;
LL L=Lucas(N/P,M/P,P);return (c*L)%P;
}
int main()
{
int T=gi();J[0]=A[1]=J[1]=1;
for(LL i=2;i<Mod;++i)A[i]=((Mod-Mod/i)*A[Mod%i])%Mod;
for(LL i=2;i<Mod;++i)J[i]=(J[i-1]*i)%Mod;
while(T--)
{
n=gi();m=(gi()-gi());m=-m+1;
printf("%lld\n",(Lucas(n+m,n,Mod)-1+Mod)%Mod);
}
return 0;
}

BZOJ4403 序列统计—Lucas你好的更多相关文章

  1. 【BZOJ4403】序列统计 Lucas定理

    [BZOJ4403]序列统计 Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input 输入第 ...

  2. Bzoj 4403: 序列统计 Lucas定理,组合数学,数论

    4403: 序列统计 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 328  Solved: 162[Submit][Status][Discuss] ...

  3. BZOJ4403: 序列统计【lucas定理+组合数学】

    Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input 输入第一行包含一个整数T,表示数据组 ...

  4. 2018.09.09 bzoj4403: 序列统计(Lucas定理)

    传送门 感觉单调不降序列什么的不好做啊. 于是我们序列中下标为i的元素的值加上i,这样就构成了一个单调递增的序列. 问题就变成了: 求出构造长度分别为1 ~ n且每个元素的值在l+1 ~ r+n之间的 ...

  5. bzoj4403 序列统计——组合数学

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4403 一开始想了个 O(n) 的做法,不行啊... O(n)想法是这样的:先考虑递推,设 f ...

  6. bzoj4403: 序列统计

    我们很容易发现答案是C(R-L+N+1,N)-1 然后用一下lucas定理就行了 #include <iostream> #include <cstdio> #include ...

  7. 【BZOJ4403】序列统计(组合数学,卢卡斯定理)

    [BZOJ4403]序列统计(组合数学,卢卡斯定理) 题面 Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取 ...

  8. BZOJ 4403: 序列统计 数学 lucas

    4403: 序列统计 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4403 Description 给定三个正整数N.L和R,统计长度在 ...

  9. bzoj 4403 序列统计 卢卡斯定理

    4403:序列统计 Time Limit: 3 Sec  Memory Limit: 128 MB Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调 ...

随机推荐

  1. 深圳尚学堂:Web程序员应该会的知识

    互联网的行业里涌入了很多的程序员, 都在为互联网的发展添砖加瓦.程序员可以分为很多种,像Unix程序员.Windows程序员,或是C++程序员.Delphi程序员,等等.今天我们谈谈Web程序员,一名 ...

  2. 《JAVASCRIPT高级程序设计》事件委托和模拟事件

    由于事件处理程序可以为现代web应用提供交互能力,因此许多开发人员不分青红皂白向页面中添加大量的处理程序:这在某些语言中不会导致问题,但是在javascript,事件处理程序数量直接关系到页面的整体运 ...

  3. SOCKET是什么

    一.问题的引入--socket的引入是为了解决不同计算机间进程间通信的问题 1.socket与进程的关系 1).socket与进程间的关系:socket   用来让一个进程和其他的进程互通信息(IPC ...

  4. mysql 打开sql日志,记录所有sql

    我使用的mysql版本为:5.7.11 win7环境 记录下下载地址,省得每次百度搜了:http://dev.mysql.com/downloads/installer/ mysql 默认没有开启sq ...

  5. Jenkins在windows上的安装配置

     今天是2月14号,所谓西方情人节,下班回来发现,2月14过的比七夕还火热.于是上网百度百科查询了"情人节". 毕竟是中国的百度啊.是这么解释的.我感到很欣慰.过得每一个节日都应该 ...

  6. MATLAB 单变量函数一阶及N阶求导

    1 对一维函数的求导及求特定函数处的变量值 %%最简单的一阶单变量函数进行求导 function usemyfunArray() %主函数必须位于最上方 clc clear syms x %syms ...

  7. block、inline、inline-block对比

    display:block 1.block元素会独占一行,多个block元素会各种新起一行.默认情况下,block元素宽度自动填满其父元素容器: 2.block元素可以设置width和height属性 ...

  8. js 将php生成的time()类型时间戳转化成具体date格式的日期

    需求:      将首页显示的int类型的时间转化为date类型的时间格式:      QuestionModel获取到question列表数据时,包括question['pub_time'],在显示 ...

  9. window7 32位安装Oracle11g

    http://www.cnblogs.com/wangsaiming/p/3573509.html

  10. [bzoj1067][SCOI2007]降雨量——线段树+乱搞

    题目大意 传送门 题解 我国古代有一句俗话. 骗分出奇迹,乱搞最神奇! 这句话在这道题上得到了鲜明的体现. 我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区 ...