jzoj6301。ユニバーサルグループ

タイトル説明

説明

入力

出力

サンプル入力
INPUT1:
1 19
1
2
3
4
5
6
7
8
9
10
233
2333
23333
666
6666
66666
233666
2333666
2336666

INPUT2:
3 19
1
2
3
4
5
6
7
8
9
10
233
2333
23333
666
6666
66666
233666
2333666
2336666

INPUT3:
4 19
1
2
3
4
5
6
7
8
9
10
233
2333
23333
666
6666
66666
233666
2333666
2336666

サンプル出力
OUTPUT1:
1
2
16
512
65536
33554432
838860732
32990492
932051910
764027380
910542875
838272742
930396622
739073573
9640642
263530905
865002813
765241490
139162994

OUTPUT2:
1
4
96
12288
7864320
201326568
293254325
515159244
840150399
651897566
739847860
531834902
591536684
577191249
16871820
69912188
532033966
249862507
753329879

OUTPUT3:
1
6
336
144384
406978560
696247661
369344513
934897514
881712217
545090322
736653783
184801125
483435346
490162119
818998946
456359890
676845946
879346635
854963600

データ制約

問題の解決策

説明を読みます

X分解は、最大2 xの素因数の数を発見しました。

したがって、プログラム= $(プログラム1の大きさがn)^ 1 {}回数であり、1および2の後に別々に考慮分解の数(N番組2の大きさ)が数2 ^ {あります}数とみなさ負のプログラム$

$ 2 ^ {(N-1)*(N-1)} $について陰性溶液、前者(N-1)*(n-1)が必要に応じてであってもよい/カラムバックラインを介して(ここで、プログラムを調整するため)ユニークです

どうやらシナリオ1がnである!、ここに解決策2を求めているに焦点を当てています

集合F [N]はN×n個の有効な解の数を表す(すなわち、すべての行/列と各2)

新規で追加の数字を入れて、転送を考えてみましょう

最後に2を入れて

明白な答えがf [N-1] * nは

最後の1に入れて2 1

起因する前の(N-1)*(N -1) 充填されているので、それらの両者は一方がなければならない他のフルラインで、ブランクにあるラインを有します

この場合、完全な行インペリアル後者は、あなただけ見つけることができるように、空の行を引っ張って一意 Nプログラムの一種に対応するN *

答えは[N-1] * N *(N-1)Fで

しかし、上記見つかっまたは再カウントされます

見つけることができ、重いカウントはケースです。

このように同じをプルアップするために、上から、下から引き下げ

の合計数に相当

プログラム

次に、重み計算プログラムは、F [N-2] * C(N、2)*(N-1)であります


最終的にはそう

F [N] = F [N-1] * N + F [N-1] * N×(N-1)-f [N-2] * C(N、2)*(N-1)

コード

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
#define two 499122177
#define mod 998244353
#define N 5000000
using namespace std;

long long F[N+1];
long long f[N+1];
long long x,s1,s2,I;
int T,n,i,j,k,l;

long long qpower(long long a,long long b)
{
    long long ans=1;
    
    while (b)
    {
        if (b&1)
        ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    
    return ans;
}

void init()
{
    I=2;
    while (x>1 && I<=100000)
    {
        if (!(x%I))
        {
            i=0;
            while (!(x%I))
            {
                ++i;
                x/=I;
            }
            
            if (i==1)
            ++s1;
            else
            ++s2;
        }
        
        ++I;
    }
    
    if (x>1)
    ++s1;
}

void Init()
{
    F[0]=1;f[0]=1;
    F[1]=1;f[1]=1;
    
    fo(i,2,N)
    {
        F[i]=F[i-1]*i%mod;
        f[i]=(f[i-1]*i%mod*i%mod-f[i-2]*i%mod*(i-1)%mod*two%mod*(i-1)%mod)%mod;
        
        if (f[i]<0)
        f[i]+=mod;
    }
}

int main()
{
    freopen("pj.in","r",stdin);
    freopen("pj.out","w",stdout);
    
    scanf("%lld%d",&x,&T);
    init();
    Init();
    
    for (;T;--T)
    {
        scanf("%d",&n);
        printf("%lld\n",qpower(F[n],s1)*qpower(f[n],s2)%mod*qpower(2,(long long)(n-1)*(n-1))%mod);
    }
}

おすすめ

転載: www.cnblogs.com/gmh77/p/11465191.html