[T2] 2019年8月15日慈渓シミュレーションゲームの組み合わせ番号(Binom)(ルーカス定理プレフィックスと高い寸法+)

ルーカス定理

タイトルといえば\(のp \)は素数です。

結果との組み合わせの必要な数が素数を法このとき、それはルーカスの定理を使用することができます。

\ [C_x ^ Y = C_ {X \ DIV \ P} ^ {Y \のDIVの\のP} \ CDOT C_ {X \ MOD \ P} ^ {Y \ MOD \のP} \]

換言すれば、我々はでき(X \)\\(Y軸\)は二つに変換される\(Pの\)次に、すべての要求は、別々に、次いで、組合せの数を乗算し、進数。

値モードの数を組み合わせたときにそこで質問は、です\(のp \)がある\(0 \)

それが素数であるので、組み合わせの数のよう\(C_A ^ B \)場合にのみ、\(<B \) その値が唯一である\(0 \)

すなわち、2つの数字のために、ある(X、Yの\)\限り、\(Y軸\)\(Pの\)はバイナリのより低い値を有する\(X \)が大きい、こと\(^ C_x = 0 Y \)

そして、高次元の接頭辞

最初のインクルージョン排除を考えてみましょう。

私たちは、合計数(プログラムの使用\(^ 2のn \)されていません)マイナス組み合わせの数を(0 \)\グループの数が、答えです。

そして\(C_x ^ Yの\)がされていない(0 \)\場合のみとすると、\(Y \)\(P \)各ビットで二進値が小さい\(X \)これは。

これは、高次元の半順序を考えていません。

次に、この質問は高いと裸次元の接頭辞になります。

:あなたはプレフィックスと高次元がわからない場合、あなたは私のブログの記事をチェックアウト行くことができ、高次元とプレフィックスに

コード

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 1000000
#define LL long long
#define Qinv(x) Qpow(x,X-2)
using namespace std;
int n,X,a[N+5],s[N+5];
class FastIO
{
    private:
        #define FS 100000
        #define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
        #define tn (x<<3)+(x<<1)
        #define D isdigit(c=tc())
        char c,*A,*B,FI[FS];
    public:
        I FastIO() {A=B=FI;}
        Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
}F;
int main()
{
    freopen("binom.in","r",stdin),freopen("binom.out","w",stdout);
    RI i;LL p,ans=0;for(F.read(n),F.read(X),i=1;i<=n;++i) F.read(a[i]),++s[a[i]];//读入
    for(p=1;p<=N;p*=X) for(i=0;i<=N;++i) (i/p)%X&&(s[i]+=s[i-p]);//高维前缀和
    for(i=1;i<=n;++i) ans+=n-s[a[i]];return printf("%lld",ans),0;//容斥求答案
}

おすすめ

転載: www.cnblogs.com/chenxiaoran666/p/Contest20190815T2.html