题目描述:

loj

题解:

容斥+生成函数。

考虑加入的第$i$个元素对结果的贡献是$[0,i-1]$,我们可以列出生成函数。

长这样:$(1)*(1+x)*(1+x+x^2)*……*(1+x+x^2+……+x^{n-1})=\frac{\prod_{i=1}^{n}1-x^i}{(1-x)^n}$

把分母提出来:$\frac{1}{(1-x)^n} = (1+x+x^2+……)^n = \sum_{i=0}^{k} C_{i+n-1}^{n-1}$,日常小球放盒。

现在还剩$\prod_{i=1}^n 1-x^i$,可以考虑将该式理解为从$1$到$n$选$i$个数,总和为$j$,对该项系数贡献为$(-1)^i$。

由于从$1$到$n$不重复,可以发现$\sum_{i=1}^{447}>100000$,那么$i \le 447$。

那么就可以$dp$了。状态为$f[i][j]$,表示当前选了$i$个数总和为$j$,且最后一项不大于$n$的方案数。

要求选数不重复怎么办?

考虑将其构造成一个上升序列。我们用枚举差值的思想,保证前后差值大于$0$。

转移有三种:

1.将$i$个数集体+1,此时$f[i][j]+=f[i][j-i]$;

2.将$i$个数集体+1再在最前面加入一个1,此时$f[i][j]+=f[i-1][j-i]$;

3.考虑我们每次都让每个数+1,所以当$j>n$时会出现最后一项为$n+1$的情况,此时$f[i][j]-=f[i-1][j-n-1]$;

这样转移就可以了。

最后卷积卷出第$k$位的值就可以了。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MOD = 1000000007;
const int N = 100050;
const int M = 450;
int fastpow(int x,int y)
{
int ret = 1;
while(y)
{
if(y&1)ret=1ll*ret*x%MOD;
x=1ll*x*x%MOD;y>>=1;
}
return ret;
}
template<typename T>
inline void Mod(T&x){if(x>=MOD)x-=MOD;}
int n,m;
int jc[N<<1],jny[N<<1],f[M][N];
void init()
{
jc[0] = 1;
for(int i=1;i<=n+m;i++)jc[i]=1ll*jc[i-1]*i%MOD;
jny[n+m] = fastpow(jc[n+m],MOD-2);
for(int i=n+m;i;i--)jny[i-1]=1ll*jny[i]*i%MOD;
}
int C(int x,int y){return 1ll*jc[x]*jny[y]%MOD*jny[x-y]%MOD;} int main()
{
scanf("%d%d",&n,&m);
init();
f[0][0] = 1;
for(int i=1;i<M;i++)for(int j=i;j<=m;j++)
{
Mod(f[i][j] = f[i-1][j-i]+f[i][j-i]);
if(j>n)Mod(f[i][j]+=MOD-f[i-1][j-n-1]);
}
int ans = 0;
for(int i=0;i<=m;i++)
{
int tmp = 0;
for(int j=0;j<M;j++)
if(j&1)Mod(tmp+=MOD-f[j][i]);
else Mod(tmp+=f[j][i]);
Mod(ans+=1ll*tmp*C(n+m-i-1,n-1)%MOD);
}
printf("%d\n",ans);
return 0;
}

loj6077. 「2017 山东一轮集训 Day7」逆序对的更多相关文章

  1. LOJ6077「2017 山东一轮集训 Day7」逆序对 (生成函数+多项式exp?朴素DP!)

    题面 给定 n , k n,k n,k ,求长度为 n n n 逆序对个数为 k k k 的排列个数,对 1 e 9 + 7 \rm1e9+7 1e9+7 取模. 1 ≤ n , k ≤ 100   ...

  2. 【LOJ6077】「2017 山东一轮集训 Day7」逆序对 生成函数+组合数+DP

    [LOJ6077]「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k ,请求出长度为 n的逆序对数恰好为 k 的排列的个数.答案对 109+7 取模. 对于一个长度为 n 的排列 p ...

  3. loj #6077. 「2017 山东一轮集训 Day7」逆序对

    #6077. 「2017 山东一轮集训 Day7」逆序对   题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...

  4. 「2017 山东一轮集训 Day7」逆序对

    题解: 满满的套路题.. 首先显然从大到小枚举 然后每次生成的逆序对是1----(i-1)的 这样做dp是nk的 复杂度太高了 那我们转化一下问题 变成sigma(ai   (ai<i)  )= ...

  5. 题解 「2017 山东一轮集训 Day7」逆序对

    题目传送门 Description 给定 $ n, k $,请求出长度为 $ n $ 的逆序对数恰好为 $ k $ 的排列的个数.答案对 $ 10 ^ 9 + 7 $ 取模. 对于一个长度为 $ n ...

  6. LOJ #6119. 「2017 山东二轮集训 Day7」国王

    Description 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当 ...

  7. loj6119 「2017 山东二轮集训 Day7」国王

    题目描述 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当这条路径上的工 ...

  8. loj #6079. 「2017 山东一轮集训 Day7」养猫【最大费用最大流】

    首先假设全睡觉,然后用费用流考虑平衡要求建立网络流 把1~n的点看作是i-k+1~k这一段的和,连接(i,i+k,1,e[i]-s[i]),表示把i改成吃饭,能对i~i+k-1这一段的点产生影响:然后 ...

  9. LOJ6079「2017 山东一轮集训 Day7」养猫

    养ImmortalCO k可重区间问题 的增强版:有上下界! 直接都选择s[i],然后再把一些调整到e[i] 考虑通过最大流的“最大”,使得至少每k个有me个e, 通过最大流的“上界”,限制每k个最多 ...

随机推荐

  1. requests post/get请求params参数和post请求正文的数据类型记录

    1. 前言 在写接口数据驱动测试框架时,(从excel表中读取的非数据的值都是str类型),发送post/get请求因为数据类型原因,请求失败,走了一些弯路,记录总结一下请求的参数或者请求正文的数据类 ...

  2. 【性能测试实战】jmeter + k8s + 微服务 + skywalking + efk,测试都在学的热门技术

    原文持续更新完善:https://www.cnblogs.com/uncleyong/p/15475614.html 前言:当前的热门主流技术是哪些?测开为啥那么火?90%以上的测试对测开认识不准确 ...

  3. Ibgreslock漏洞利用

  4. BI工具有多重要?凭什么得到各类企业的热烈追捧?

    近年来,应用BI工具的企业越来越多,企业对BI工具的重视说明企业了解.认识到了数据的价值.数据分析工具已经渐渐成为企业日常经营管理活动中不可或缺的一项重要工作内容.但是你知道企业应该如何挑选BI工具吗 ...

  5. Smartbi权限安全管理系统_保障数据权限安全

    思迈特软件Smartbi具有完善的安全管理体系,Smartbi权限安全管理系统它可以控制用户功能权限.数据访问权限.资源访问权限.Smartbi权限安全管理系统支持按用户.用户组.角色进行管理:支持多 ...

  6. C# CLR简介

     (一)CLR介绍 CLR是一个可以由多编程语言使用的运行时,CLR的核心功能:内存管理,程序集加载,安全性,异常处理,线程同步等等.可以被很多属于微软系列的开发语言使用. 事实上,在运行时,CLR根 ...

  7. Qt:QDateTime

    0.说明 提供时间日期的表达和相关函数. QDateTime通过日期+时间来构造一个日期时间.它综合了QDate和QTime的所有特性. 它可以通过系统时钟来获取当前DateTime.它还提供了比较时 ...

  8. Qt:QJsonParseError

    0.说明 QJsonParseError用于JSON解析时报告error. 1.模块和加载项 Header #include<QJsonParseError> qmake QT += co ...

  9. python opencv识别蓝牌车牌号 之 取出车牌号 (1/3)

    概述 车牌识别是计算机视频图像识别技术在车辆牌照识别中的一种应用,通常来讲如果结合opencv进行车牌识别主要分为四个大步骤,分别为: 图像采集 车牌定位 分割车牌字符 字符识别 当然,如果结合了机器 ...

  10. JZ-024-二叉树中和为某一值的路径

    二叉树中和为某一值的路径 题目描述 输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 题目链 ...