bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法
4559: [JLoi2016]成绩比较
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 261 Solved: 165
[Submit][Status][Discuss]
Description
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神那么厉害,你只需要计算出情况数模1
0^9+7的余数就可以了。
Input
第一行包含三个正整数N,M,K,分别表示G系的同学数量(包括B神),必修课的数量和被B神碾压的同学数量。第二
行包含M个正整数,依次表示每门课的最高分Ui。第三行包含M个正整数,依次表示B神在每门课上的排名Ri。保证1
≤Ri≤N。数据保证至少有1种情况使得B神说的话成立。N<=100,M<=100,Ui<=10^9
Output
仅一行一个正整数,表示满足条件的情况数模10^9+7的余数。
Sample Input
3 2 1
2 2
1 2
Sample Output
10
HINT
Source
容斥+拉格朗日插值法
讲一个性质:
对于n阶等差数列 (如 1^5,2^5,3^5,4^5….被称为5阶等差)
它们的前n项和可以用一个最高次为n+1次的多项式表示
它们的通项公式可以用一个最高次为n次的多项式表示
因此,我们可以用拉格朗日插值法来优化一些多项式计算
(其实我不是很懂)
推荐blog
http://www.cnblogs.com/zj75211/p/8029303.html
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #define MAXN 105
- #define _ %mod
- #define filein(x) freopen(#x".in","r",stdin);
- #define fileout(x) freopen(#x".out","w",stdout);
- using namespace std;
- const int mod=;
- int dp[MAXN],U[MAXN],R[MAXN],C[MAXN][MAXN],Y[MAXN],inv[MAXN];
- int N,M,K,ANS;
- int pow(int a,int b){
- int now=;
- while(b){
- if(b&) now=(1ll*now*a)_;
- a=(1ll*a*a)_; b>>=;
- }
- return now;
- }
- int Lagrange(int u,int r){
- static int lpi[MAXN],rpi[MAXN],p[MAXN],ans,tmp;
- lpi[]=; rpi[N+]=; ans=;
- for(int i=;i<=N+;i++){
- p[i]=(1ll*p[i-]+1ll*pow(i,N-r)*pow(u-i,r-)_)_;
- if(i==u) return p[i];
- }
- for(int i=;i<=N+;i++) lpi[i]=1ll*lpi[i-]*(u-i)_;
- for(int i=N+;i>=;i--) rpi[i]=1ll*rpi[i+]*(u-i)_;
- for(int i=;tmp=,i<=N+;i++){
- tmp=1ll*tmp*lpi[i-]_*rpi[i+]_*inv[i-]_*inv[N+-i]_*p[i]_;
- tmp=(1ll*tmp*((N+-i)&?-:)+mod)_;
- ans=(1ll*ans+tmp)_;
- }
- return ans;
- }
- int main()
- {
- scanf("%d%d%d",&N,&M,&K);
- inv[]=; inv[]=;
- for(int i=;i<=N+;i++) inv[i]=((-1ll*(mod/i)*inv[mod%i])_+mod)_;
- for(int i=;i<=N+;i++) inv[i]=1ll*inv[i]*inv[i-]_;
- for(int i=;i<=M;i++) scanf("%d",&U[i]);
- for(int i=;i<=M;i++) scanf("%d",&R[i]);
- for(int i=;i<=N;i++){
- C[i][]=;
- for(int j=;j<=i;j++)
- C[i][j]=(1ll*C[i-][j-]+C[i-][j])_;
- }
- for(int i=;i<=M;i++) Y[i]=Lagrange(U[i],R[i]);
- for(int i=N-;i>=K;i--)
- {
- dp[i]=C[N-][i];
- for(int j=;j<=M;j++) dp[i]=1ll*dp[i]*C[N-i-][N-R[j]-i]_;
- ANS=(1ll*ANS+(((i^K)&)?-:)*1ll*dp[i]*C[i][K]_+mod)_;
- }
- for(int i=;i<=M;i++) ANS=1ll*ANS*Y[i]_;
- printf("%d",(ANS+mod)_);
- return ;
- }
bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法的更多相关文章
- ●BZOJ 4559 [JLoi2016]成绩比较(容斥)
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4559 题解: 容斥,拉格朗日插值法. 结合网上的另一种方法,以及插值法,可以把本题做到 O( ...
- P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值
LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...
- BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)
BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...
- bzoj千题计划270:bzoj4559: [JLoi2016]成绩比较(拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=4559 f[i][j] 表示前i门课,有j个人没有被碾压的方案数 g[i] 表示第i门课,满足B神排名 ...
- BZOJ.2655.calc(DP/容斥 拉格朗日插值)
BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...
- BZOJ4559 JLOI2016成绩比较(容斥原理+组合数学+斯特林数)
容斥一发改为计算至少碾压k人的情况数量,这样对于每门课就可以分开考虑再相乘了.剩下的问题是给出某人的排名和分数的值域,求方案数.枚举出现了几种不同的分数,再枚举被给出的人的分数排第几,算一个类似斯特林 ...
- HDU - 4059: The Boss on Mars (容斥 拉格朗日 小小的优化搜索)
pro: T次询问,每次给出N(N<1e8),求所有Σi^4 (i<=N,且gcd(i,N)==1) ; sol: 因为N比较小,我们可以求出素因子,然后容斥. 主要问题就是求1到P的 ...
- BZOJ.4558.[JLOI2016]方(计数 容斥)
BZOJ 洛谷 图基本来自这儿. 看到这种计数问题考虑容斥.\(Ans=\) 没有限制的正方形个数 - 以\(i\)为顶点的正方形个数 + 以\(i,j\)为顶点的正方形个数 - 以\(i,j,k\) ...
- [BZOJ4558]:[JLoi2016]方(容斥+模拟)
题目传送门 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形上帝把我们派到了一个有N行M列的方格图上,图上一共有$(N+1)\times ...
随机推荐
- android context获取目录详解
获取 sqlite系统数据库路径 方式1: ApkInfo apkInfo = new ResourceUtil(context).getApkInfo(); APP_PATH = new Strin ...
- 从PRISM开始学WPF(二)Prism?
目录: 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WPF(三)Prism-Region? 从PRISM开始学WPF(四)Prism-Modu ...
- MySQL搭建主从数据库 实现读写分离
首先声明,实际生产中,网站为了提高用户体验,性能等,将数据库实现读写分离是有必要的,我们让主数据库去写入数据,然后当用户查询的时候,然后在从数据库读取数据,故能减轻数据库的压力,实现良好的用户体验! ...
- Linux下高效指令
Linux管理磁盘 资本指令 查看当前磁盘使用情况:df -h fdisk -l (查看所有的硬盘) 服务器添加硬盘:在系统设置添加 分区: fdisk /dev/sdb (sdb, sdc, sde ...
- 完美解决ubuntu Desktop 16.04 中文版firefox在非root用户不能正常启动的问题
ubuntu安装好后,默认安装有firefox浏览器,不过,非root的账户登录,双击firefox图标,居然出现如下提示:Your Firefox profile cannot be loaded. ...
- Mego(1) - NET中主流ORM框架性能对比
从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择.在ORM的众多问题中最突出的问题是关于性能方面的问 ...
- 【JavaScript中typeof、toString、instanceof、constructor与in】
JavaScript中typeof.toString.instanceof.constructor与in JavaScript 是一种弱类型或者说动态语言.这意味着你不用提前声明变量的类型,在程序运行 ...
- Angular 学习笔记 ( CDK - Overlays )
更新 : 2018-01-30 ng 的 overlap 在关闭的时候对 backdrop 做了一个 style pointer 目的是让 backdrop 不被 2 次点击, 但是呢, css p ...
- 新概念英语(1-37)Making a bookcase
What is Susan's favourite color ? A:You're working hard, Georage. What are you doing? B:I am making ...
- java设计模式—— 工厂模式
菜鸡互啄... 工厂模式通过定义一个创建对象的接口,让其子类决定实例化哪个工厂类.因此我们要解决接口选择的问题,实现不同的计划创建不同的对象. 首先我们定义一个轿车接口 public interfac ...