luoguP4859는 더 이상 두려울 게 없어요.
luoguP4859는 더 이상 두려울 게 없어요.
천국을 제사 지내는 bzoj.
luogu
해제 시간
먼저 $n - k $를 홀수로 특판하였습니다.
$m = (n + k)/2$는 $A>B $의 개수입니다.
흠정을 바로 고치다.
$dp(i, j)$를 설정하여 $A$의 이전 $i$개수를 고려하여 $j$가 $A>B$에 대한 방안 수를 정합니다.
$g(i) = dp(n, i)\times(n - i)!$가 지정되었습니다.
그리고 직접 2항식 반전 $f (m) =\sum\limits{ i = m }^{ n } ( - 1 )^{ i - m }\binom{ i }{ m } g( i ) $ .
코드
#include
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operatorinline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=2011,mo=1000000009;
lint add(lint a,lint b){return (a+=b)>=mo?a-mo:a;}
void doadd(lint &a,lint b){if(b<0) b+=mo;if((a+=b)>=mo) a-=mo;}
lint fac[N],c[N][N];
void init()
{
fac[0]=1;for(int i=1;i<=2000;i++) fac[i]=fac[i-1]*i%mo;
for(int i=0;i<=2000;i++) c[i][0]=1;
for(int i=1;i<=2000;i++)for(int j=1;j<=i;j++) c[i][j]=add(c[i-1][j-1],c[i-1][j]);
}
int n,m,a[N],b[N];
lint dp[N][N],ans;
int main()
{
init(),read(n),read(m);for(int i=1;i<=n;i++) read(a[i]);for(int i=1;i<=n;i++) read(b[i]);sort(a+1,a+1+n),sort(b+1,b+1+n);
if((n-m)&1){puts("0");return 0;}m=(n+m)/2;
for(int i=0;i<=n;i++) dp[i][0]=1;
for(int i=1,k=1;i<=n;i++)
{
while(k<=n&&a[i]>b[k]) k++;
for(int j=1;j<=n;j++) dp[i][j]=add(dp[i-1][j],dp[i-1][j-1]*(k-j)%mo);
}
for(int i=m;i<=n;i++) doadd(ans,(((i-m)&1)?-1ll:1ll)*c[i][m]*dp[n][i]%mo*fac[n-i]%mo);
printf("%lld
",ans);
return 0;
}
}
int main(){return RKK::main();}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.