日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Educational Codeforces Round 111 (Rated for Div. 2) D. Excellent Arrays 组合数学 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳送門

文章目錄

  • 題意:
  • 思路:

題意:

給你一個數組aia_iai?,定義一個數組是好的當且僅當對于所有iii都有ai!=ia_i!=iai?!=i。定義f(a)f(a)f(a)表示數組aaai<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)lai?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^9n2e5,?109l1,nr109

思路:

首先考慮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)kmin(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 组合数学的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。