#排列组合#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 字符串转为 char *
			
std::string str = "abc"; const char *p = str.data(); 更多: https://www.cnblogs.com/devilmayc ...
 - C++ 指针的错误释放
			
错误代码: #include <iostream> int main() { int* ptr = (int*)malloc(4); int i = 1111; ptr = &i; ...
 - 常用SQL语句备查
			
查询表中某一列是否有重复值 SELECT bizType, COUNT(bizType) FROM Res GROUP BY bizType HAVING COUNT(bizType) > 1 ...
 - Elasticsearch系列之-查询
			
Elasticsearch之-查询 查询分类: 基本查询:使用es内置查询条件进行查询 组合查询:把多个查询组合在一起进行复合查询 过滤:查询的同时,通过filter条件在不影响打分的情况下筛选数据 ...
 - 【Azure Redis 缓存】使用StackExchange.Redis,偶发ERROR  - Timeout performing HSET (15000ms)
			
问题描述 使用StackExchange.Redis 作为Redis客户端SDK,连接Azure Redis服务,长期运行后发现,每天都偶发 Timeout Error. 错误消息如下: StackE ...
 - C++socket服务器与客户端简单通信流程
			
服务器和客户端简单通信的流程,做一个简单的复习: 1.服务器创建的流程 代码如下,各个重要函数已经写注释: #include <iostream> // 推荐加上宏定义 #define W ...
 - 使用 maven 的  `wagon-maven-plugin`插件 快速部署 到不同的 环境
			
profile 在pom文件中配置 开发和测试环境的 profile信息, <profiles> <profile> <!-- 开发环境 --> <id> ...
 - 2、mysql存储引擎
			
存储引擎 1 存储引擎概述 和大多数的数据库不同, MySQL中有一个存储引擎的概念, 针对不同的存储需求可以选择最优的存储引擎. 存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式 .存 ...
 - Zabbix“专家坐诊”第183期问答汇总
			
问题一 Q:老师,请问一下zabbix采集的数据怎么过滤,获取数据是nottime=20:30 notafter=3,怎么过滤出netafter=3 ?谢谢. A:过滤器设置如下图. 问题二 Q:大佬 ...
 - WPF之资源
			
目录 WPF对象资源的定义和查找 动态.静态使用资源 向程序添加二进制资源 字符串资源 非字符串资源 使用Pack URI路径访问二进制资源 WPF不但支持程序级的传统资源,同时还推出了独具特色的对象 ...