传送门

文章目录

  • 题意:
  • 思路:

题意:

给你一个数组aia_iai​,定义一个数组是好的当且仅当对于所有iii都有ai!=ia_i!=iai​!=i。定义f(a)f(a)f(a)表示数组aaa中i<j,ai+aj=i+ji<j,a_i+a_j=i+ji<j,ai​+aj​=i+j的(i,j)(i,j)(i,j)对数。定义一个数组是极好的包含以下三个条件:
(1)a(1)a(1)a数组是好的。
(2)l≤ai≤r(2)l\le a_i\le r(2)l≤ai​≤r
(3)f(a)(3)f(a)(3)f(a)在所有的好的数组中是最大的。
给定l,rl,rl,r,让你求出来有多少个极好的数组。
n≤2e5,−109≤l≤1,n≤r≤109n\le2e5,-10^9\le l\le1,n\le r\le 10^9n≤2e5,−109≤l≤1,n≤r≤109

思路:

首先考虑f(a)f(a)f(a)最大的时候是什么情况,如果没有ai!=ia_i!=iai​!=i的条件,肯定是ai=ia_i=iai​=i的时候最大。现在有这个条件,那么我们可以将其加上一个偏移量kkk,即ai+k,ai−ka_i+k,a_i-kai​+k,ai​−k,考虑长度nnn的数组,一定是一半ai+ka_i+kai​+k,另一半ai−ka_i-kai​−k,这样f(a)=⌈n2⌉∗⌊n2⌋f(a)=\left \lceil \frac{n}{2} \right \rceil * \left \lfloor \frac{n}{2} \right \rfloorf(a)=⌈2n​⌉∗⌊2n​⌋,此时一定是最大的。
通过以上分析,我们知道每个位置一定是加上或减去一个偏移量kkk构造出来的数组才有可能是极好的数组,由于aia_iai​的范围有限制,我们分以下几种情况讨论:
(1)k≤min(1−l,r−n)(1)k\le min(1-l,r-n)(1)k≤min(1−l,r−n)
此时对于每个位置ai+k,ai−ka_i+k,a_i-kai​+k,ai​−k两个数都不会超过范围,所以当nnn为偶数的时候,可以选择n/2n/2n/2个位置+k+k+k,贡献就是C(n,n/2)C(n,n/2)C(n,n/2),是奇数的时候,可以选择n/2n/2n/2个位置+k+k+k或者n/2+1n/2+1n/2+1个位置+k+k+k。
(2)k>min(1−l,r−n)(2)k>min(1-l,r-n)(2)k>min(1−l,r−n)
我们设k=min(1−l,r−n)+1k=min(1-l,r-n)+1k=min(1−l,r−n)+1,那么有max(1,l+k)−1max(1,l+k)-1max(1,l+k)−1个人必须+k+k+k,有n−min(n,r−k)n-min(n,r-k)n−min(n,r−k)个人必须−k-k−k,否则他们就越界了。设减去上述两个剩下的位置是restrestrest,那么问题转换成跟第一种情况一样了,只是从nnn变成了restrestrest。
注意第二种情况我们不需要特判,只需要在求C(n,m)C(n,m)C(n,m)的时候判断一下n,m<0,n<mn,m<0,n<mn,m<0,n<m的情况直接返回000即可。
第二种情况最多迭代nnn次,复杂度O(n)O(n)O(n)。

// Problem: D. Excellent Arrays
// Contest: Codeforces - Educational Codeforces Round 111 (Rated for Div. 2)
// URL: https://codeforces.com/contest/1550/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,l,r;
LL fun[N],inv[N];LL qmi(LL a,LL b) {LL ans=1; a%=mod;while(b) {if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans%mod;
}LL C(int a,int b) {if(a<0||b<0||a<b) return 0;return fun[a]*inv[b]%mod*inv[a-b]%mod;
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);fun[0]=1;for(int i=1;i<N;i++) fun[i]=fun[i-1]*i%mod;inv[N-1]=qmi(fun[N-1],mod-2);for(int i=N-2;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;int _; scanf("%d",&_);while(_--) {scanf("%d%d%d",&n,&l,&r);int begin=min(1-l,r-n);LL ans=0;if(n%2==0) ans+=C(n,n/2)*begin%mod;else ans+=(C(n,n/2)+C(n,n/2+1))%mod*begin%mod;for(LL t=begin+1,cnt=n;cnt;t++,cnt--) {int lcnt=max(1ll,l+t)-1;int rcnt=n-min(1ll*n,r-t);int rest=n-lcnt-rcnt;if(n%2==0) ans+=C(rest,n/2-lcnt),ans%=mod;else ans+=(C(rest,n/2-rcnt)+C(rest,n/2-rcnt+1))%mod,ans%=mod;}printf("%lld\n",ans%mod);}int c;return 0;
}
/**/

Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学相关推荐

  1. Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp

    传送门 文章目录 题意: 思路: 题意: 给你一个串,只包含前kkk个字母和???,定义fif_ifi​表示第iii个字母在串中出现的最长连续长度,你现在需要将???替换为前kkk个字母,使得mini ...

  2. Educational Codeforces Round 111 (Rated for Div. 2)

    Educational Codeforces Round 111 (Rated for Div. 2) 题号 题目 知识点 A Find The Array B Maximum Cost Deleti ...

  3. Educational Codeforces Round 80 (Rated for Div. 2) C. Two Arrays 组合数|dp

    传送门 文章目录 题意: 思路: 题意: 给你n,mn,mn,m,让你构造两个数组a,ba,ba,b满足:1<=ai,bi<=n1<=a_i,b_i<=n1<=ai​,b ...

  4. Educational Codeforces Round 33 (Rated for Div. 2) E. Counting Arrays

    题目链接 题意:给你两个数x,yx,yx,y,让你构造一些长为yyy的数列,让这个数列的累乘为xxx,输出方案数. 思路:考虑对xxx进行质因数分解,设某个质因子PiP_iPi​的的幂为kkk,则这个 ...

  5. Educational Codeforces Round 138 (Rated for Div. 2) D

    Educational Codeforces Round 138 (Rated for Div. 2) D. Counting Arrays 题意 给定长度为nnn的数组aaa,若gcd(ai,i)= ...

  6. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  7. Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)

    Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords 思路 题意非常简单,就是得到最多的物品嘛,我们假定a, ...

  8. Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环

    传送门 文章目录 题意: 思路: 题意: 给你一张图,你需要给这个图的边染色,保证如果有环那么这个环内边的颜色不全相同,输出染色方案和用的颜色个数. n,m≤5e3n,m\le5e3n,m≤5e3 思 ...

  9. Educational Codeforces Round 73 (Rated for Div. 2) E. Game With String 思维博弈 好题(2500)

    传送门 文章目录 题意: 思路: 题意: 思路: 我们将每一段...拿出来看成若干段,将其分成以下四种情况: (1)len<b(1)len<b(1)len<b (2)b≤len< ...

最新文章

  1. 2022-2028年中国数码相机行业投资分析及前景预测报告
  2. Blender数字雕刻终极指南学习教程
  3. solidworks工具集_【第1975期】SolidWorks!从3D扫描到3D打印的一站式设计工具
  4. 微信公众号开发(python+werobot)-自动回复
  5. IDEA直接跳转到方法的实现类快捷键
  6. Linux:客户端的实现
  7. JDBC——编程式事务的实现逻辑
  8. oppo手机快速截屏的方法
  9. c#中excel文件怎么转换为dbf文件
  10. java机甲类回合制游戏,课内资源 - 基于java的RPG回合制游戏
  11. 计算机网络练习题-3
  12. simulink中对powergui的使用
  13. 在线版和离线版电路仿真以及开源电子硬件设计介绍
  14. Android 蓝牙 BLE扫描、广播、连接、数据收发源码分析(2)- inquiry扫描周围设备
  15. 主流PC浏览器使用的内核
  16. matlab 门函数频谱,时域门函数及门函数串的频谱分析
  17. 四叉树 Quadtrees
  18. 《重装系统》Windows纯净装机+常用工具(最简单易懂教程)--菜鸟小回
  19. 基于JSP(java)网络百宝箱的设计和实现(含源文件)
  20. 全球与中国网络连接视频门铃对讲机系统市场深度研究分析报告势

热门文章

  1. 数学里最令人着迷的公式之一--欧拉公式!
  2. 当你女朋友向你索吻的时候。。
  3. 全世界的狗都没有“生殖隔离” | 今日趣图
  4. 减肥瘦不下来的原因找到了
  5. jmeter聚个报告怎么看qps_Jmeter 使用笔记之 html 报告扩展(一)
  6. html 表格 左侧表头,左侧是表头的JS表格控件(自写,网上没有的)
  7. icd11中文版精神障碍pdf_精神与行为障碍类别目录(ICD-11)
  8. mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发
  9. sql不等于0怎么表示_数组真的只能从0开始吗?python表示不同意
  10. c语言字符串中取最大字符串,使用C语言提取子字符串及判断对称子字符串最大长度...