题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4403

一开始想了个 O(n) 的做法,不行啊...

O(n)想法是这样的:先考虑递推,设 f[i][j] 为在第 i 个位置选第 j 个数字;

设 m = r-l+1;

那么 f[i][j] = ∑(1<=k<=j) f[i-1][k],初值是 f[1][i] = 1 (1<=i<=m);

那么 ans = ∑(1<=i<=n , 1<=j<=m) f[i][j];

这个式子换个角度想,可以考虑初值的1贡献了几次;

对于每个 f[1][j],发现它到 i=2 的位置贡献了 m - j 次,之后每次递推贡献了 ∑(1<=i<=m-j) i 次,也就是 C(m-j , 2) 次;

所以 ans = ∑(1<=i<=m) (C(i,2) * (n-2) + i) + m,其中最后加的 m 是 ∑(1<=i<=m) f[1][i];

但这个时间复杂度是 O(n) 的,不行啊...

然后看了博客:https://blog.csdn.net/Clove_unique/article/details/68491395

竟然是如此简洁!我就是太关注那个序列,其实只需要选出几个数,之后再排序就好了啊!!

需要预处理阶乘逆元,而且别忘了处理 0 的逆元。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const mod=1e6+;
int T,n,l,r,m;
ll ans,fac[mod+],inv[mod+];
ll pw(ll a,ll b)
{
ll ret=;
for(;b;b>>=,a=(a*a)%mod)
if(b&)ret=(ret*a)%mod;
return ret;
}
void init()
{
fac[]=;
for(int i=;i<mod;i++) fac[i]=(fac[i-]*i)%mod;
inv[mod-]=pw(fac[mod-],mod-);//不能求 inv[mod]
for(int i=mod-;i>=;i--) inv[i]=(inv[i+]*(i+))%mod;//要处理出0的逆元!
}
ll C(int n,int m)
{
if(n<m)return ;
// ll a=1,b=1; m=min(m,n-m);
// for(int i=n-m+1;i<=n;i++)a=(a*i)%mod;
// for(int i=1;i<=m;i++)b=(b*i)%mod;
// return (a*pw(b,mod-2))%mod;
return ((fac[n]*inv[m])%mod*inv[n-m])%mod;
}
ll Lucas(ll n,ll m)
{
if(m==)return ;
return (C(n%mod,m%mod)*Lucas(n/mod,m/mod))%mod;
}
int main()
{
init();
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&l,&r); m=r-l+;
ll ans=Lucas((ll)n+m,m)-;
printf("%lld\n",(ans%mod+mod)%mod);//
}
return ;
}

bzoj4403 序列统计——组合数学的更多相关文章

  1. BZOJ4403 序列统计—Lucas你好

    绝对是全网写的最详细的一篇题解  题目:序列统计 代码难度:简单 思维难度:提高+-省选 讲下题面:给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案 ...

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

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

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

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

  4. bzoj4403: 序列统计

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

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

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

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

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

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

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

  8. BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]

    3992: [SDOI2015]序列统计 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1017  Solved: 466[Submit][Statu ...

  9. [SDOI2015]序列统计

    [SDOI2015]序列统计 标签: NTT 快速幂 Description 给你一个模m意义下的数集,需要用这个数集生成一个数列,使得这个数列在的乘积为x. 问方案数模\(1004535809\). ...

随机推荐

  1. A5. JVM 如何判断GC对象

    [概述] 在堆里面存放着 Java 世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还 “存活” 着,哪些已经 “死去”(即不可能再被任何途径使用的对象). ...

  2. Nginx + Lets'encrypt 实现HTTPS访问七牛空间资源

    上一篇文章 为七牛云存储空间绑定自定义域名,并使用七牛云提供的免费SSL证书,将自定义加名升级为HTTPS 我们提到利用七牛的免费SSL证书,将自定义加名升级为HTTPS的方法. 不知道有没有小伙伴会 ...

  3. Django-REST-Framework JWT 实现SSO认证(上)

    一.什么是Django-REST-Framework? Django-REST-framework 是基于Django框架的一个web RESTful风格开发的框架,它可以实现API接口的快速开发,但 ...

  4. ISO7220M芯片调试总结

    3.3V或者5V供电        速度可以达到150Mbps      有25年的寿命 调试问题总结: 在调试中发现,芯片焊接的时候很容易损坏,甚至350度焊接,时间在5s的时间都会坏掉.当坏掉的时 ...

  5. java 访问对象私有变量

    Captcha captcha = getCaptcha(captchaId); // 通过反射获取验证码值 Class<?> classType = captcha.getClass() ...

  6. const int * 和 int * const 傻傻分不清楚

    const int * a和int const *a一样,定义时不是必须初始化,指针可以指向其他变量,但是指向的变量的值不能修改. int * const定义时必须初始化,即必须指明指向哪个变量,定义 ...

  7. 【Codeforces 675D】Tree Construction

    [链接] 我是链接,点我呀:) [题意] 依次序将数字插入到排序二叉树当中 问你每个数字它的父亲节点上的数字是啥 [题解] 按次序处理每一个数字 对于数字x 找到最小的大于x的数字所在的位置i 显然, ...

  8. [NOI2000] 单词查找树

    ★★   输入文件:trie.in   输出文件:trie.out   简单对比 时间限制:1 s   内存限制:128 MB 在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里.为了提 ...

  9. Redis: 改变HomeBrew安装的数据库文件目录

    vi /usr/local/etc/redis.conf 修改dir "/Volumes/KG's Big YO/Documents/redis_data" 最后,启动Redis: ...

  10. ORA-00600: internal error code, arguments: [kkqtSetOp.1]

    新数据库从32升级到64位的11G 11 2 0 3 有条SQL 语句运行的时候会导致内部错误. 使用PL/SQL DEVELOPER 查询该语句的运行机会 按F5键 就激发了这个ORA600 单击此 ...