题目链接

题目描述

G系共有n位同学,M门必修课。这N位同学的编号为0到N-1的整数,其中B神的编号为0号。这M门必修课编号为0到M-1的整数。一位同学在必修课上可以获得的分数是1到Ui中的一个整数。

如果在每门课上A获得的成绩均小于等于B获得的成绩,则称A被B碾压。在B神的说法中,G系共有K位同学被他碾压(不包括他自己),而其他N-K-1位同学则没有被他碾压。D神查到了B神每门必修课的排名。

这里的排名是指:如果B神某门课的排名为R,则表示有且仅有R-1位同学这门课的分数大于B神的分数,有且仅有N-R位同学这门课的分数小于等于B神(不包括他自己)。

我们需要求出全系所有同学每门必修课得分的情况数,使其既能满足B神的说法,也能符合D神查到的排名。这里两种情况不同当且仅当有任意一位同学在任意一门课上获得的分数不同。

你不需要像D神那么厉害,你只需要计算出情况数模10^9+7的余数就可以了。

Sol

量比较多,且初步看上去合并很困难,那么我们就必然从容斥的角度入手来简化问题了。

首先我们注意到有一个恰好有 K 个人被 B 君完虐的条件,这个条件使得学科之间有了联系,因为我们必须保证某些成绩低于 B 君的分数都落在某一个人身上,而我们如果仅仅只需考虑一门学科的话是很好算的。所以我们把这个条件容斥掉,那么就二项式反演列出初步的式子:

\[\sum_{i=k}^{n-1} (-1)^{i-k}{i\choose k}{n-1\choose i}\prod_{j=1}^m F[i][j]
\]

先枚举总共至少上有多少个人被B君完虐,前面的一个组合数就是二项式反演的容斥系数,后面的组合数则是在除B君外的 \(n-1\) 个人里挑出 \(i\) 个被完虐。之后各个学科之间就互不影响了,方案数直接乘起来。

那么后面的方案数 \(F[i][j]\) 是什么呢,就是对于一门学科 \(j\) 而言,现在强制有了至少 \(i\) 个人被完虐,使得排名合法的方案数。

这个的式子是比较轻松就可以列出的。

\[F[i][j]=\sum_{x=1}^{U_j} x^{n-R[j]}*(U[j]-x)^{R[j]-1}*{n-1-i\choose R[j]-1}
\]

直接枚举 B 君这一门的分数 ,我们可以确定有多少个人的分数小于等于他和大于他,并且枚举了分数之后这些人的分数范围也出来了。后面乘上一个组合数是因为除了强制的被完虐的人已经给 B 君垫着以外,为了保证B君在这一们学科上的排名,我们还需要额外选出一些人给他垫着。

发现这样子其实中间一大坨东西都和 i 没有关系,我们直接把中间的处理出来就可以了,那么就看怎么算中间的这个东西了:

\[\sum_{x=1}^{U_j} x^{n-R[j]}*(U[j]-x)^{R[j]-1}
\]

直接暴力二项式定理展开然后交换求和顺序就好了,最后的式子长这样:

\[\sum_{t=0}^{R[j]-1}(-1)^t{R[j]-1\choose t}U+j^{R[j]-1-t}*\sum_{x=1}^{U_j}x^{n-R[j]+t}
\]

后面那玩意就是自然指数幂了,随便用一种方法就行了。(所以我现在做的拉格朗日插值的题目怎么都是求自然指数幂以及他们的前缀和啊)

code:

#include<bits/stdc++.h>
using namespace std;
template<class T>inline void init(T&x){
x=0;char ch=getchar();bool t=0;
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);
if(t) x=-x;return;
}
typedef long long ll;
int n,m,k;
const int N=112;
const int mod=1e9+7;
int U[N],R[N],fac[N],finv[N];
const int inv2=500000004;
template<class T>inline void Inc(T&x,int y){x+=y;if(x>=mod) x-=mod;}
template<class T>inline void Dec(T&x,int y){x-=y;if(x < 0 ) x+=mod;}
template<class T>inline int fpow(int x,T k){int ret=1;for(;k;k>>=1,x=(ll)x*x%mod) if(k&1) ret=(ll)ret*x%mod;return ret;}
inline int Sum(int x,int y){x+=y;return x>=mod? (x-mod):x;}
inline int Dif(int x,int y){x-=y;return x < 0 ? (x+mod):x;}
inline int C(int n,int m){return n<m? 0:((ll)fac[n]*finv[m]%mod*finv[n-m]%mod);}
int F[N],S[N];
inline void Prework(){
int m=110;
fac[0]=finv[0]=1;
for(register int i=1;i<=m;++i) fac[i]=1ll*fac[i-1]*i%mod;
finv[m]=fpow(fac[m],mod-2);
for(register int i=m-1;i;--i) finv[i]=1ll*finv[i+1]*(i+1)%mod;
return;
}
int Y[N];
inline int Lagerange(int K,int n){
int LIM=K+2;int S=1;
for(int i=1;i<=LIM;++i) {S=(ll)S*Dif(n,i)%mod;Y[i]=Sum(Y[i-1],fpow(i,K));}
if(n<=LIM) return Y[n];
int ans=0;
for(int i=1;i<=LIM;++i) {
int ret=(ll)S*fpow(Dif(n,i),mod-2)%mod*finv[i-1]%mod*finv[LIM-i]%mod;
if((LIM-i)&1) ret=mod-ret;
Inc(ans,(ll)Y[i]*ret%mod);
}
return ans;
}
int main()
{
init(n),init(m),init(k);
int Mx=0;Prework();
for(register int i=1;i<=m;++i) init(U[i]);
for(register int i=1;i<=m;++i) init(R[i]),Mx=max(Mx,R[i]);
--Mx;int ans=0;
for(int i=1;i<=m;++i) {
F[i]=0;
int inv=fpow(U[i],mod-2);
int G=fpow(U[i],R[i]);
for(int t=0;t<R[i];++t){
G=(ll)G*inv%mod;
int ret=(ll)C(R[i]-1,t)*G%mod*Lagerange(n-R[i]+t,U[i])%mod;
(t&1)? Dec(F[i],ret):Inc(F[i],ret);
}
}
for(int i=k;i<=n;++i) {
if(n-1-i<Mx) break;
int ret=(ll)C(i,k)*C(n-1,i)%mod;
int base=1;
for(int j=1;j<=m;++j) base=(ll)base*C(n-1-i,R[j]-1)%mod*F[j]%mod;
((i-k)&1)? Dec(ans,(ll)ret*base%mod):Inc(ans,(ll)ret*base%mod);
}
cout<<Sum(ans,mod)%mod<<endl;
}

【LuoguP3270】[JLOI2016] 成绩比较的更多相关文章

  1. bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

  2. bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)

    http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...

  3. 【BZOJ4559】[JLoi2016]成绩比较 动态规划+容斥+组合数学

    [BZOJ4559][JLoi2016]成绩比较 Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M-1的整数.一 ...

  4. [JLOI2016] 成绩比较

    推石子 首先设\(d[i]=\sum_{t=1}^{U[i]}t^{n-R[i]}(U[i]-t)^{R[i]-1}\),即第\(i\)门课程分数的合法分布方案数: 然后设\(f[i,j]\)表示前\ ...

  5. BZOJ4559: [JLoi2016]成绩比较(dp 拉格朗日插值)

    题意 题目链接 Sol 想不到想不到.. 首先在不考虑每个人的真是成绩的情况下,设\(f[i][j]\)表示考虑了前\(i\)个人,有\(j\)个人被碾压的方案数 转移方程:\[f[i][j] = \ ...

  6. bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...

  7. 【bzoj4559】[JLoi2016]成绩比较(dp+拉格朗日插值)

    bzoj 题意: 有\(n\)位同学,\(m\)门课. 一位同学在第\(i\)门课上面获得的分数上限为\(u_i\). 定义同学\(A\)碾压同学\(B\)为每一课\(A\)同学的成绩都不低于\(B\ ...

  8. LG4781 【模板】拉格朗日插值 和 JLOI2016 成绩比较

    [模板]拉格朗日插值 题目描述 由小学知识可知,$n$个点$(x_i,y_i)$可以唯一地确定一个多项式 现在,给定$n$个点,请你确定这个多项式,并将$k$代入求值 求出的值对$998244353$ ...

  9. BZOJ4559&P3270[JLoi2016]成绩比较

    题目描述 \(G\)系共有\(n\)位同学,\(M\)门必修课.这\(N\)位同学的编号为\(0\)到\(N-1\)的整数,其中\(B\)神的编号为\(0\)号.这\(M\)门必修课编号为\(0\)到 ...

随机推荐

  1. 【mysql】查询最新的10条记录

    实现查询最新10条数据方法: select * from 表名 order by id(主键) desc limit 10 参考文档: MySQL查询后10条数据并顺序输出

  2. lua源码学习篇一:环境部署

    研究生即将毕业,答辩完成后,这几天有些时间.开始写一些自己的东西,记录自己的学习历程. --前言 本着学习和交流的原则,本文的内容仅供参考,而不是权威版本,如有任何问题,欢迎指出. --声明 跨专业考 ...

  3. 测开之路一百四十三:ORM框架之SQLAlchemy模型及表创建

    基于前一篇内容,可以使用模型的结构 目录结构 main,入口层 from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy app = ...

  4. Elasticsearch入门(二)

    基础概念 Elasticsearch有几个核心概念,从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT) Elasticsearch是一个接近实时的搜索平台.这意味着,从索引一个文档 ...

  5. MySQL学习-入门语句以及增删查改

    1. SQL入门语句 SQL,指结构化查询语言,全称是 Structured Query Language,是一种 ANSI(American National Standards Institute ...

  6. Neither abstinence nor excess ever renders man happy

    inch.n. 英寸 courageous.adj.勇敢的 porcelain.n.瓷器 adj.脆的 inventor. n. 发明者 trivial.adj. 不重要的 grove.n.小树林,果 ...

  7. 关于migration build failed的问题

    首先一定要执行dotnet restore 查看网站的依赖关系(有时候生成是不报错的但是restore会找不到文件路径) 检查执行命令的路径是否是正确的当前网站路径 build failed一定是生成 ...

  8. vue2.0父子组件通信以及同级组件通信

    1.父向子通信 父组件为singer.vue.子组件为list-view.vue.需要把歌手的数据传给子组件.则绑定 :data = 'singers' ,singers为父组件的值.data为子组件 ...

  9. 第九周总结&第七次实验报告

    实验7 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 实验过程 ...

  10. ubuntu 安装企业级容器 docker harbor

    安装docker harbor 企业级容器   环境说明: 操作系统: ubuntu16.04.5 LTS IP地址:  192.168.31.129   https://github.com/goh ...