bzoj4403 序列统计——组合数学
题目: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 序列统计——组合数学的更多相关文章
- BZOJ4403 序列统计—Lucas你好
绝对是全网写的最详细的一篇题解 题目:序列统计 代码难度:简单 思维难度:提高+-省选 讲下题面:给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案 ...
- BZOJ4403: 序列统计【lucas定理+组合数学】
Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input 输入第一行包含一个整数T,表示数据组 ...
- 2018.09.09 bzoj4403: 序列统计(Lucas定理)
传送门 感觉单调不降序列什么的不好做啊. 于是我们序列中下标为i的元素的值加上i,这样就构成了一个单调递增的序列. 问题就变成了: 求出构造长度分别为1 ~ n且每个元素的值在l+1 ~ r+n之间的 ...
- bzoj4403: 序列统计
我们很容易发现答案是C(R-L+N+1,N)-1 然后用一下lucas定理就行了 #include <iostream> #include <cstdio> #include ...
- 【BZOJ4403】序列统计(组合数学,卢卡斯定理)
[BZOJ4403]序列统计(组合数学,卢卡斯定理) 题面 Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取 ...
- Bzoj 4403: 序列统计 Lucas定理,组合数学,数论
4403: 序列统计 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 328 Solved: 162[Submit][Status][Discuss] ...
- 【BZOJ4403】序列统计 Lucas定理
[BZOJ4403]序列统计 Description 给定三个正整数N.L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量.输出答案对10^6+3取模的结果. Input 输入第 ...
- BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1017 Solved: 466[Submit][Statu ...
- [SDOI2015]序列统计
[SDOI2015]序列统计 标签: NTT 快速幂 Description 给你一个模m意义下的数集,需要用这个数集生成一个数列,使得这个数列在的乘积为x. 问方案数模\(1004535809\). ...
随机推荐
- EasyUI_datagrid
案例一丶jquery.easyui.min.js:10631 Uncaught TypeError: this.renderEmptyRow is not a function 解决方法:datagr ...
- poj - 3254 - Corn Fields (状态压缩)
poj - 3254 - Corn Fields (状态压缩)超详细 参考了 @外出散步 的博客,在此基础上增加了说明 题意: 农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的( ...
- 有哪些可以节省chrome内存的扩展插件?
不知道从什么时候开始,chrome浏览器就这样不知不觉的超过IE浏览器成为全球第一大浏览器.我们在赞赏chrome浏览器流畅的速度时,更多的是对其chrome插件功能的赞赏.但是我们也发现了一个致命的 ...
- Python随笔day02
算术运算符 + - * ** / // % 比较运算符 > < == >= <= != Python中提供一种更加简单的比较方式. 当判断 ...
- macos-mojave
macos-mojave https://itunes.apple.com/cn/app/macos-mojave/id1398502828?mt=12
- js cookies all in one
js cookies all in one cookies // http://10.1.5.202/auto-deploy-platform/publish/index.html // 非当前 UR ...
- BZOJ3238:[AHOI 2013]差异
求一个字符串的∑ ∑ len[i] + len[j] - 2 * lcp(i, j),其中i,j表示从i,j开始的后缀. 方法一:SA+单调栈,自行yy. 方法二:SAM构造出来,然后每个状态对答案的 ...
- 洛谷—— P2176 [USACO14FEB]路障Roadblock
https://www.luogu.org/problem/show?pid=2176 题目描述 每天早晨,FJ从家中穿过农场走到牛棚.农场由 N 块农田组成,农田通过 M 条双向道路连接,每条路有一 ...
- cogs——1578. 次小生成树初级练习题
1578. 次小生成树初级练习题 ☆ 输入文件:mst2.in 输出文件:mst2.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 求严格次小生成树 [输入格式 ...
- 武大OJ 613. Count in Sama’s triangle
Description Today, the math teacher taught Alice Hui Yang’s triangle. However, the teacher came up w ...