LOJ #6432. 「PKUSC2018」真实排名
对于这道题,现场我写炸了......谁跟我说组合数O(n)的求是最快的?(~!@#¥¥%……&
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
;
;
ll ksm(ll x, ll n) {
ll ans = 1ll; //printf("%lld ", x);
while( n) {
) ans = ans * x % mod; x = x * x % mod;
n >>= ;
}
// printf("ans = %lld, %lld\n", ans, x);
return ans;
}
ll zt[N];
ll lucas(int m, int n) {
ll x = zt[m] * zt[n-m] % mod; //printf("%lld\n", ksm(x, mod-2));
) % mod;
}
int data[N], a[N], n, k;
ll query1(int x) {
, data++n, a[x]) - data;
, data++n, (a[x] + >> ) - ) - data - ;
if( l + n - r < k) return 0ll;
return lucas(k, l + n - r);
}
ll query2(int x) {
, data++n, a[x]) - data;
, data++n, a[x] << ) - data;
if( l == r) r ++;
if( r - l > k) return 0ll;
return lucas(k-r+l, l + n - r);
}
int main() {
zt[] = zt[] = 1ll;
; i <= N-; i ++) zt[i] = zt[i-] * i % mod;
// for( int i = 1; i <= 10; i ++) printf("%d ", zt[i]); puts("");
scanf("%d%d", &n, &k);
; i <= n; i ++) scanf("%d", a+i), data[i] = a[i];
sort(data+, data++n);
; i <= n; i ++)
printf("%lld\n", (query1(i) + query2(i)) % mod);
}
我们先复制一份排个序
我们考虑2种情况:
1:当前节点不变的情况,则大于他的节点和小于他的一半的节点都可以改变(显然),注意一下0,然后我们可以求得可以改变的数的个数t1。
2:当前节点要改变,那么想要维持他的排名不变,那么大于等于他且小于他的2倍的数都要改变(显然),然后我们可以求得可以改变的数t2。
然后就是求组合数(心态炸了QAQ)......
预处理一下,然后因为mod为质数,所以可以用费马小定理在log的时间内求得逆元......
每次logN的求t1, t2,。logmod的时间求逆元,所以复杂度是O(nlogn+logmod)。
费马小定理 : a^(p-1) % p == 1 (p为质数);
组合数 : 
(当时我脑抽用这个公式每次O(n)的求组合数只有45分QAQ,应该预处理阶乘)

LOJ #6432. 「PKUSC2018」真实排名的更多相关文章
- LOJ #6432. 「PKUSC2018」真实排名(组合数)
题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...
- Loj 6432. 「PKUSC2018」真实排名 (组合数)
题面 Loj 题解 枚举每一个点 分两种情况 翻倍or不翻倍 \(1.\)如果这个点\(i\)翻倍, 要保持排名不变,哪些必须翻倍,哪些可以翻倍? 必须翻倍: \(a[i] \leq a[x] < ...
- LOJ 6432 「PKUSC2018」真实排名——水题
题目:https://loj.ac/problem/6432 如果不选自己,设自己的值是 x ,需要让 “ a<x && 2*a>=x ” 的非 x 的值不被选:如果选自己 ...
- Loj#6432「PKUSC2018」真实排名(二分查找+组合数)
题面 Loj 题解 普通的暴力是直接枚举改或者不改,最后在判断最后对哪些点有贡献. 而这种方法是很难优化的.所以考虑在排序之后线性处理.首先先假设没有重复的元素 struct Node { int p ...
- 【LOJ】#6432. 「PKUSC2018」真实排名
题解 简单分析一下,如果这个选手成绩是0,直接输出\(\binom{n}{k}\) 如果这个选手的成绩没有被翻倍,那么找到大于等于它的数(除了它自己)有a个,翻倍后不大于它的数有b个,那么就从这\(a ...
- #6432. 「PKUSC2018」真实排名(组合数学)
题面 传送门 题解 这数据范围--这输出大小--这模数--太有迷惑性了-- 首先对于\(0\)来说,不管怎么选它们的排名都不会变,这个先特判掉 对于一个\(a_i\)来说,如果它不选,那么所有大于等于 ...
- 「PKUSC2018」真实排名(排列组合,数学)
前言 为什么随机跳题会跳到这种题目啊? Solution 我们发现可以把这个东西分情况讨论: 1.这个点没有加倍 这一段相同的可以看成一个点,然后后面的都可以. 这一段看成一个点,然后前面的不能对他造 ...
- 「PKUSC2018」真实排名(组合)
一道不错的组合数问题! 分两类讨论: 1.\(a_i\) 没有翻倍,那些 \(\geq a_i\) 和 \(a_j\times 2<a_i\) 的数就没有影响了.设 \(kth\) 为 \(a_ ...
- 「PKUSC2018」真实排名
题面 题解 因为操作为将一些数字翻倍, 所以对于一个数\(x\), 能影响它的排名的的只有满足\(2y\geq x\)或\(2x>y\)的\(y\) 将选手的成绩排序,然后考虑当前点的方案 1. ...
随机推荐
- Python 安装urllib3
一.系统环境 操作系统:Win10 64位 Python版本:Python 3.7.0 二.报错信息 No module named 'urllib3' 三.安装参考 1.参照网上的安装方法通过pip ...
- Hadoop 使用Combiner提高Map/Reduce程序效率
众所周知,Hadoop框架使用Mapper将数据处理成一个<key,value>键值对,再网络节点间对其进行整理(shuffle),然后使用Reducer处理数据并进行最终输出. 在上述过 ...
- c语言实践 1/1+1/2+1/3+1/4+...+1/n
给定一个n求这个分式的和. int n = 1; float sum = 0; float frac = 0; int i = 1; scanf_s("%d",&n); w ...
- launchpad, jira, github
一.简介 http://segmentfault.com/q/1010000000165115
- R list frame, matrix
list是个筐,什么都可以往里装,包括它自身.数据框是个二维数组,同列必须同类型,行随意.
- Part4_lesson1---Bootloader设计蓝图
1.bootloader的作用 2.u-boot是bootloader业界的老大 u-boot分为自主模式和开发模式 3.建立U-boot工程 uboot不能在window下面进行解压,因为在wind ...
- C# winform中Setting.settings 相关知识点
1.在Settings.settings文件中定义配置字段.包含字段名.类型.范围.值四部分的属性. 字段名.类型和值类似编程中字段的定义一样使用,不再过多的解释.重点讲一下”范围“字段的含义与区别. ...
- HDU 3365 New Ground (计算几何)
题意:给定点A[0~n-1]和B[0],B[1],A[0].A[1]映射到B[0].B[1],求出其余点的映射B[2]~B[n-1]. 析:运用复数类,关键是用模板复数类,一直编译不过,我明明能编译过 ...
- 编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护
建议40:使用event关键字为委托施加保护 在建议中我们实现了一个具有通知功能的文件传输类,如下: class FileUploader { public delegate void FileUpl ...
- 日期多选插件Kalendae.js
在项目中要实现日期多选的功能,于是在网上找到Kalendae.js,此文主要记录本人对于Kalendae.js的一些用法,以便以后查阅,希望对读者也有所帮助 主要内容如下: Kalendaejs一句话 ...