タイトル説明
説明
入力
出力
サンプル入力
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);
}
}