質問:
私たちは、長さの呼び出し\(2Nの\を)場合は、列の数が面白いですと列の数は、次の3つの条件を満たしている場合にのみ:
(1)からである\(1 \)に\(2N \)共\(2N \)の整数の順列{ \(AI \) }。
(2)奇数の用語の全てを満足\(A1 <A3 <... <-A2nをれる1 \) 、全ての偶数用語満足\(A2 <A4 <... <A2Nは\) 。
(3)任意の2つの隣接する\(A2i-1 \)と\(A2i(1≤i≤n)\)未満満たす奇数、偶数、すなわち:\(1 A2i-に<A2i \へ。) 。
タスクは、以下のようになります。与えられたため、\(\ N-) 、異なる長さの要求の数\(2N \)面白いシリーズ。最終的な答えはこれだけ必要な出力応答、大きいかもしれないので\(MOD P \)の値。
ソリューション:
$ 1251442 $
未満奇数偶数\(図面> =ポップ\)これは、数のカトレアです
私たちは、どのような式によって解決されなければならない
$ \のFRAC {C_ {2N} ^ N-} {n-は+ 1} $ = \(\ FRAC {2nの!} {N-!* N-!} \) * \(\ FRAC {1} { +。1} N- \) = \(\ + prod_ {N-2}} ^ {N-2 ** \)
この質問はまだ終わっていないが
、あなたが拡張使用して、それは必ずしも素数モジュラスではないでしょうルーカス
まあ、実際には、画分を削減するための唯一の分解定理であります
私はあなたが分について、できる理由を知りませんが、
回数のために各画面の私の最初の素因数を開くには、\(T 50 \)を
ポインティングhyhた後
、私は議論が各数の分解から前方に移動することができた\(SQRT \)レベル
コード:
#include<stdio.h>
#include<iostream>
using namespace std;
#define maxnn 2000100
#define ll long long
ll zhi[maxnn];
ll n,p;
ll phi[maxnn];
ll cnt[maxnn];
ll len=0;
ll is[maxnn];
void init()
{
phi[1]=1;
for(ll i=2;i<=2000000;i++)
{
if(!phi[i])
zhi[++len]=i;
for(int j=1;j<=len&&zhi[j]*i<=2000000;j++)
{
phi[zhi[j]*i]=1;
if(i%zhi[j]==0) break;
}
}
}
void iiit(){
for(ll i=2*n;i>=1;i--)
{
if(is[i])
{
if(zhi[lower_bound(zhi+1,zhi+len+1,i)-zhi]==i) continue;
for(int j=2;j*j<=i;j++)
{
if(i%j==0)
{
is[j]+=is[i];
is[i/j]+=is[i];
break;
}
}
}
}
for(int i=1;i<=len&&zhi[i]<=2*n;i++)
{
if(is[zhi[i]]) cnt[zhi[i]]+=is[zhi[i]];
}
}
ll ksm(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%p;
a=a*a%p;
b>>=1;
}
return ans;
}
int main(){
cin>>n>>p;
for(ll i=n+2;i<=2*n;i++) is[i]=1;
for(ll i=1;i<=n;i++) is[i]=-1;
init();
iiit();
ll tot=1;
for(ll i=1;i<=len&&zhi[i]<=2*n;i++)
{
if(cnt[zhi[i]]) tot=tot*ksm(zhi[i],cnt[zhi[i]])%p;
}
cout<<tot%p;
}