興味深いことに、列の数は、固有の分解定理Cartland番号+

質問:
私たちは、長さの呼び出し\(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;
}

おすすめ

転載: www.cnblogs.com/OIEREDSION/p/11495105.html