#排列组合#CF1550D Excellent Arrays
分析
对于excellent的 \(a\) 来说 \(|a_i-i|=x\) 的值是固定的,考虑枚举它
一半正一半负时函数值是最大的,当 \(n\) 为奇数时要分为两种情况(不过可以通过杨辉三角合并)
问题是,由于 \(l,r\) 的范围,并不能做到所有位置都能可正可负,不过不超过 \(mn=\min\{1-l,r-n\}\) 时是可以的,也就是 \(C(n,mid)*mn\)。
之后应分为两个阶段,绝对值增加1会产生1个不能可正可负,不超过 \(mx=\max\{1-l,r-n\}\) 时,枚举 \(i(mn+i=x)\) 即为 \(C(n-i,mid-i)\)
或者产生2个不能可正可负,此时在上一阶段的上界基础上继续增加,就是 \(C(n-i*2-(mx-mn),mid-i-(mx-mn))\)
注意 \(i\) 在第一阶段超过 \(mid\) 抑或是第二阶段超过 \(mid-(mx-mn)\) 时已经无法产生贡献,此时可直接终止,那么复杂度就是 \(O(n)\) 的
代码(里面的 \(mx\) 已经减去了 \(mn\))
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=200011,mod=1000000007;
int inv[N],fac[N],n,L,R,mn,mx,mid,odd,ans;
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
void Mo(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
int C(int n,int m){return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;}
int main(){
fac[0]=inv[0]=fac[1]=inv[1]=1;
for (int i=2;i<N;++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for (int i=2;i<N;++i) fac[i]=1ll*fac[i-1]*i%mod,inv[i]=1ll*inv[i-1]*inv[i]%mod;
for (int T=iut();T;--T,putchar(10)){
n=iut(),L=iut(),R=iut(),mid=(n+1)>>1;
mn=min(1-L,R-n),mx=max(1-L,R-n)-mn;
odd=n&1,ans=1ll*mn*C(n+odd,mid)%mod;
for (int i=1;i<=mx&&i<=mid;++i) Mo(ans,C(n-i+odd,mid-i));
for (int i=1;i<=mid-mx&&i*2+mx<=n;++i) Mo(ans,C(n-i*2-mx+odd,mid-mx-i));
print(ans);
}
return 0;
}
#排列组合#CF1550D Excellent Arrays的更多相关文章
- CF1550D Excellent Arrays
考虑每个数一定是这个形式: \(i + x,i - x\) 所以如果我们要构造一个最大的数组. 那一定是这样的形式: 有一半为\(i + x\),有一半\(i - x\) 那么我们发现每个数有这样一个 ...
- java-算法-排列组合
package com.qinghuainvest.utils.algorithm; import java.util.ArrayList; import java.util.Arrays; impo ...
- 数组排列组合问题——BACKTRACKING
BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...
- 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合
给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...
- JavaScript 二维数组排列组合2
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
- JavaScript 递归法排列组合二维数组2
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
- JavaScript 递归法排列组合二维数组
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
- JavaScript 二维数组排列组合
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
- 学习sql中的排列组合,在园子里搜着看于是。。。
学习sql中的排列组合,在园子里搜着看,看到篇文章,于是自己(新手)用了最最原始的sql去写出来: --需求----B, C, F, M and S住在一座房子的不同楼层.--B 不住顶层.C 不住底 ...
- .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...
随机推荐
- String--getline()
#include <string> #include <sstream> #include <iostream> int main() { std::wstring ...
- 海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储
前言 Hik防爆摄像头录像,因为防爆摄像头会有对应的APP软件,与普通的网络摄像头和球机不一样,默认认为它不可以通过web网页配置,所以弄了个来实测确认. 经测试实际上也是可以通过web网页配置 ...
- vscode中跑go test时打印详细信息配置
1.文件>首选项>设置>搜索Test Flags 2.选择在settings.json中编辑 3.添加以下内容 "go.testFlags":[ "-v ...
- 【LeetCode哈希表】前k个高频词,利用哈希表+vector进行排序操作
前k个高频词 https://leetcode.cn/problems/top-k-frequent-words/ 给定一个单词列表 words 和一个整数 k ,返回前 k 个出现次数最多的单词. ...
- 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis删除 TLS 1.0 和 1.1的计划及问题
问题描述 Azure Redis 正式关闭TLS1.0和1.1关闭的时间 根据文档描述Azure Redis阶段2我们将停止支持 TLS 1.1 和 TLS 1.0,暂时计划 2020 年 12 月 ...
- 【拉格朗日优化dp】P4365 [九省联考 2018] 秘密袭击 coat
[拉格朗日优化dp]P4365 [九省联考 2018] 秘密袭击 coat 题目简述 求树上所有连通块第 \(k\) 大点权(不足 \(k\) 点记为 \(0\))的和. \(1\leq k\leq ...
- [VueJsDev] 基础知识 - Button的全局节流
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html Button的全局节流 ::: details 目录 目录 ...
- ubuntu16.04 关闭系统的屏幕阅读功能
在安装audacity的时候,不知道点到哪里,电脑突然就不停的"Chinese Letter",后面仔细听,鼠标点到那里就会读那里文字,键盘输入也是,联想到Android上也有类似 ...
- 基于wifi的音频采集及处理解决方案小结
一沉浮 这些年,一直围绕着音频来做案子,做出来的案子自己都数不清楚了.记得前几年,刚出道的时候,就把wifi音频传输的设备做出来了.可惜的是,当初太超前市场了,鲜有人问.随着时间的推移,在疫情之 ...
- Node.js解压版的环境配置及相关常用命令
下载 进入node.js官网的下载页面node.js下载页面,选择合适的版本进行下载 配置 1.设置环境变量 随便找一个地方,将文件解压出来 复制当前的路径,我的电脑右键,打开属性,左边有个高级系统配 ...