結果

問題 No.1068 #いろいろな色 / Red and Blue and more various colors (Hard)
ユーザー autumn-eelautumn-eel
提出日時 2020-05-29 22:49:38
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 2,168 ms / 3,500 ms
コード長 1,427 bytes
コンパイル時間 1,990 ms
コンパイル使用メモリ 180,816 KB
実行使用メモリ 30,400 KB
最終ジャッジ日時 2024-11-06 18:42:16
合計ジャッジ時間 42,455 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,816 KB
testcase_02 AC 2 ms
6,820 KB
testcase_03 AC 33 ms
6,820 KB
testcase_04 AC 22 ms
6,816 KB
testcase_05 AC 25 ms
6,820 KB
testcase_06 AC 20 ms
6,816 KB
testcase_07 AC 18 ms
6,820 KB
testcase_08 AC 24 ms
6,820 KB
testcase_09 AC 27 ms
6,820 KB
testcase_10 AC 12 ms
6,820 KB
testcase_11 AC 17 ms
6,820 KB
testcase_12 AC 11 ms
6,816 KB
testcase_13 AC 2,141 ms
30,112 KB
testcase_14 AC 2,141 ms
30,400 KB
testcase_15 AC 2,168 ms
29,540 KB
testcase_16 AC 2,139 ms
29,412 KB
testcase_17 AC 2,129 ms
29,600 KB
testcase_18 AC 2,134 ms
29,616 KB
testcase_19 AC 2,143 ms
29,536 KB
testcase_20 AC 2,130 ms
29,484 KB
testcase_21 AC 2,136 ms
29,540 KB
testcase_22 AC 2,129 ms
29,408 KB
testcase_23 AC 2,135 ms
29,368 KB
testcase_24 AC 2,127 ms
29,536 KB
testcase_25 AC 2,131 ms
29,532 KB
testcase_26 AC 2,125 ms
29,660 KB
testcase_27 AC 2,124 ms
29,536 KB
testcase_28 AC 2,130 ms
29,536 KB
testcase_29 AC 2,134 ms
29,540 KB
testcase_30 AC 2,120 ms
29,408 KB
testcase_31 AC 2 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
using namespace std;
typedef long long ll;

const int MOD=998244353;
const int r=3;

ll ppow(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1)res=(res*a)%MOD;
		a=(a*a)%MOD;
		b>>=1;
	}
	return res;
}

void dft(vector<ll>&f,bool inv=false){
	int n=f.size();
	rep(i,n){
		int b=31-__builtin_clz(n);
		int j=0;
		rep(k,b){
			if(i>>k&1)j|=1<<(b-k-1);
		}
		if(i<j)swap(f[i],f[j]);
	}
	for(int i=2;i<=n;i<<=1){
		ll w=ppow(r,(MOD-1)/i);
		if(inv)w=ppow(w,MOD-2);
		for(int k=0;k<n;k+=i){
			ll x=1;
			rep(j,i/2){
				ll t=x*f[k+j+i/2]%MOD,u=f[k+j];
				f[k+j]=(u+t)%MOD;
				f[k+j+i/2]=(u+MOD-t)%MOD;
				(x*=w)%=MOD;
			}
		}
	}
	if(inv){
		ll n_inv=ppow(n,MOD-2);
		rep(i,n)(f[i]*=n_inv)%=MOD;
	}
}

vector<ll>multiply(vector<ll>A,vector<ll>B){
	int m=A.size()+B.size();
	int N=1;while(N<A.size()+B.size())N<<=1;
	A.resize(N);B.resize(N);
	dft(A,0);
	dft(B,0);
	vector<ll>f(N);
	rep(i,N)f[i]=A[i]*B[i]%MOD;
	dft(f,1);
	f.erase(f.begin()+m,f.end());
	return f;
}

int main(){
	int n,q;cin>>n>>q;
	vector<vector<ll>>vs;
	rep(i,n){
		ll a;scanf("%lld",&a);
		vs.push_back({(a%MOD+MOD-1)%MOD,1});
	}
	while(vs.size()>1){
		vector<vector<ll>>nx;
		for(int i=0;i+1<vs.size();i+=2){
			auto res=multiply(vs[i],vs[i+1]);
			if(i+2==vs.size()-1)res=multiply(res,vs[i+2]);
			nx.push_back(res);
		}
		vs=nx;
	}
	rep(i,q){
		int b;scanf("%d",&b);
		printf("%lld\n",vs[0][b]);
	}
}
0