結果

問題 No.1856 Mex Sum 2
ユーザー smiken_61smiken_61
提出日時 2022-02-26 16:30:04
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 1,340 ms / 3,000 ms
コード長 10,552 bytes
コンパイル時間 2,585 ms
コンパイル使用メモリ 215,292 KB
実行使用メモリ 5,504 KB
最終ジャッジ日時 2024-07-04 12:50:31
合計ジャッジ時間 38,491 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
5,248 KB
testcase_01 AC 3 ms
5,376 KB
testcase_02 AC 6 ms
5,376 KB
testcase_03 AC 4 ms
5,376 KB
testcase_04 AC 4 ms
5,376 KB
testcase_05 AC 3 ms
5,376 KB
testcase_06 AC 3 ms
5,376 KB
testcase_07 AC 3 ms
5,376 KB
testcase_08 AC 4 ms
5,376 KB
testcase_09 AC 3 ms
5,376 KB
testcase_10 AC 4 ms
5,376 KB
testcase_11 AC 4 ms
5,376 KB
testcase_12 AC 3 ms
5,376 KB
testcase_13 AC 4 ms
5,376 KB
testcase_14 AC 4 ms
5,376 KB
testcase_15 AC 3 ms
5,376 KB
testcase_16 AC 4 ms
5,376 KB
testcase_17 AC 5 ms
5,376 KB
testcase_18 AC 4 ms
5,376 KB
testcase_19 AC 4 ms
5,376 KB
testcase_20 AC 4 ms
5,376 KB
testcase_21 AC 3 ms
5,376 KB
testcase_22 AC 6 ms
5,376 KB
testcase_23 AC 4 ms
5,376 KB
testcase_24 AC 5 ms
5,376 KB
testcase_25 AC 6 ms
5,376 KB
testcase_26 AC 4 ms
5,376 KB
testcase_27 AC 3 ms
5,376 KB
testcase_28 AC 4 ms
5,376 KB
testcase_29 AC 293 ms
5,504 KB
testcase_30 AC 146 ms
5,376 KB
testcase_31 AC 271 ms
5,376 KB
testcase_32 AC 411 ms
5,376 KB
testcase_33 AC 461 ms
5,376 KB
testcase_34 AC 266 ms
5,376 KB
testcase_35 AC 146 ms
5,376 KB
testcase_36 AC 67 ms
5,376 KB
testcase_37 AC 265 ms
5,376 KB
testcase_38 AC 48 ms
5,376 KB
testcase_39 AC 5 ms
5,376 KB
testcase_40 AC 8 ms
5,504 KB
testcase_41 AC 9 ms
5,504 KB
testcase_42 AC 1,284 ms
5,376 KB
testcase_43 AC 1,081 ms
5,376 KB
testcase_44 AC 1,168 ms
5,376 KB
testcase_45 AC 1,267 ms
5,504 KB
testcase_46 AC 1,097 ms
5,376 KB
testcase_47 AC 1,202 ms
5,376 KB
testcase_48 AC 1,290 ms
5,376 KB
testcase_49 AC 1,278 ms
5,504 KB
testcase_50 AC 924 ms
5,376 KB
testcase_51 AC 1,321 ms
5,376 KB
testcase_52 AC 1,324 ms
5,376 KB
testcase_53 AC 1,333 ms
5,376 KB
testcase_54 AC 1,340 ms
5,376 KB
testcase_55 AC 1,320 ms
5,504 KB
testcase_56 AC 1,329 ms
5,376 KB
testcase_57 AC 1,338 ms
5,376 KB
testcase_58 AC 1,333 ms
5,376 KB
testcase_59 AC 1,329 ms
5,376 KB
testcase_60 AC 1,335 ms
5,376 KB
testcase_61 AC 1,325 ms
5,376 KB
testcase_62 AC 1,332 ms
5,376 KB
testcase_63 AC 1,315 ms
5,504 KB
testcase_64 AC 1,327 ms
5,376 KB
testcase_65 AC 1,319 ms
5,376 KB
testcase_66 AC 1,324 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

    #include <bits/stdc++.h>
 //   #include <atcoder/all>
     
     
     
     
  //  using namespace atcoder;
     
     
    // tabaicho see https://boostjp.github.io/tips/multiprec-int.html   
    // #include <boost/multiprecision/cpp_int.hpp>
     
    // using namespace boost::multiprecision;
     
    // cpp_int
    // int128_t
    // int256_t
    // int512_t
    // int1024_t
     
    // uint128_t
    // uint256_t
    // uint512_t
    // uint1024_t
     

     
    #define int long long
     #define inf  1000000007
    // #define inf  998244353
     
     #define pa pair<int,int>
     #define ppa pair<pa,pa>
     #define ll long long
     #define PI 3.14159265358979323846
     #define  mp make_pair
     #define  pb push_back
     #define EPS (1e-8)
     
          using namespace std;
                                              
     int dx[8]={0,1,0,-1,1,1,-1,-1};
     int dy[8]={1,0,-1,0,-1,1,1,-1};
                                                
    class pa3{
    	public:
    	int x;
    	int y,z;
    	pa3(int x=0,int y=0,int z=0):x(x),y(y),z(z) {}
    	bool operator < (const pa3 &p) const{
    		if(x!=p.x) return x<p.x;
    		if(y!=p.y) return y<p.y;
    		 return z<p.z;
    		//return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator > (const pa3 &p) const{
    		if(x!=p.x) return x>p.x;
    		if(y!=p.y) return y>p.y;
    		 return z>p.z;
    		//return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator == (const pa3 &p) const{
    		return x==p.x && y==p.y && z==p.z;
    	}
    		bool operator != (const pa3 &p) const{
    			return !( x==p.x && y==p.y && z==p.z);
    	}
     
    };
     
    class pa4{
    	public:
    	int x;
    	int y,z,w;
    	pa4(int x=0,int y=0,int z=0,int w=0):x(x),y(y),z(z),w(w) {}
    	bool operator < (const pa4 &p) const{
    		if(x!=p.x) return x<p.x;
    		if(y!=p.y) return y<p.y;
    		if(z!=p.z)return z<p.z;
    		return w<p.w;
    		//return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator > (const pa4 &p) const{
    		if(x!=p.x) return x>p.x;
    		if(y!=p.y) return y>p.y;
    		if(z!=p.z)return z>p.z;
    		return w>p.w;
    		//return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator == (const pa4 &p) const{
    		return x==p.x && y==p.y && z==p.z &&w==p.w;
    	}
    		
     
    };
    class pa2{
    	public:
    	int x,y;
    	pa2(int x=0,int y=0):x(x),y(y) {}
    	pa2 operator + (pa2 p) {return pa2(x+p.x,y+p.y);}
    	pa2 operator - (pa2 p) {return pa2(x-p.x,y-p.y);}
    	bool operator < (const pa2 &p) const{
    		return y != p.y ? y<p.y: x<p.x;
    	}
    	bool operator > (const pa2 &p) const{
    		return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator == (const pa2 &p) const{
    		return abs(x-p.x)==0 && abs(y-p.y)==0;
    	}
    	bool operator != (const pa2 &p) const{
    		return !(abs(x-p.x)==0 && abs(y-p.y)==0);
    	}
    		
     
    };
     
     
     
    string itos( int i ) {
    	ostringstream s ;
    	s << i ;
    	return s.str() ;
    }
     
    int Gcd(int v,int b){
    	if(v==0) return b;
    	if(b==0) return v;
    	if(v>b) return Gcd(b,v);
    	if(v==b) return b;
    	if(b%v==0) return v;
    	return Gcd(v,b%v);
    }
     
     
     
    int extgcd(int a, int b, int &x, int &y) {
        if (b == 0) {
            x = 1;
            y = 0;
            return a;
        }
        int d = extgcd(b, a%b, y, x);
        y -= a/b * x;
        return d;
    }
    pa operator+(const pa & l,const pa & r) {   
        return {l.first+r.first,l.second+r.second};                                    
    }    
    pa operator-(const pa & l,const pa & r) {   
        return {l.first-r.first,l.second-r.second};                                    
    }  
     
     
    pair<double,double> operator-(const pair<double,double> & l,const pair<double,double> & r) {   
        return {l.first-r.first,l.second-r.second};                                    
    }  
     
    ostream& operator<<(ostream& os, const vector<int>& VEC){
    	for(auto v:VEC)os<<v<<" ";
        return os;
    }
     
     ostream& operator<<(ostream& os, const pair<double,double>& PAI){
    	os<<PAI.first<<" : "<<PAI.second;
        return os;
    }
     
     
    ostream& operator<<(ostream& os, const pa& PAI){
    	os<<PAI.first<<" : "<<PAI.second;
        return os;
    }
     
    ostream& operator<<(ostream& os, const pa3& PAI){
    	os<<PAI.x<<" : "<<PAI.y<<" : "<<PAI.z;
        return os;
    }
     
    ostream& operator<<(ostream& os, const pa4& PAI){
    	os<<PAI.x<<" : "<<PAI.y<<" : "<<PAI.z<<" : "<<PAI.w;
        return os;
    }
     
    ostream& operator<<(ostream& os, const vector<pa>& VEC){
    	for(auto v:VEC)os<<v<<" ";
        return os;
    }
     
     
    ostream& operator<<(ostream& os, const vector<pa3>& VEC){
    	for(auto v:VEC){
    		os<<v<<" ";
    	os<<endl;
    	}
        return os;
    }
     
    int beki(int wa,ll rr,int warukazu){
    	if(rr==0) return 1%warukazu;
    	if(rr==1) return wa%warukazu;
    	wa%=warukazu;
    	if(rr%2==1) return ((ll)beki(wa,rr-1,warukazu)*(ll)wa)%warukazu;
    	ll zx=beki(wa,rr/2,warukazu);
    	return (zx*zx)%warukazu;
    }
     
     
                  
    int pr[2500002];
    int inv[2500002];
     
     
     
     
   const int mod=998244353;
   //const int mod=1000000007;
   
    int comb(int nn,int rr){
    	if(nn==-1&&rr==-1)return 1;
    	if(rr<0 || rr>nn || nn<0) return 0;
    	int r=pr[nn]*inv[rr];
    	r%=mod;
    	r*=inv[nn-rr];
    	r%=mod;
    	return r;
    }
     
    void gya(int ert){
    	pr[0]=1;
    	for(int i=1;i<=ert;i++){
    		pr[i]=((ll)pr[i-1]*i)%mod;
    	}
    		inv[ert]=beki(pr[ert],mod-2,mod);
    	for(int i=ert-1;i>=0;i--){
    		inv[i]=(ll)inv[i+1]*(i+1)%mod;
    	}
    }
     
     
    int beki(int a,int b){
    	int ANS=1;
    	int be=a%mod;
    	while(b){
    		if(b&1){
    			ANS*=be;
    			ANS%=mod;
    		}
    		be*=be;
    		be%=mod;
    		b/=2;
    	}
    	return ANS;
    }
     
                    
     
     
                    
                  //   cin.tie(0);
        		//	ios::sync_with_stdio(false);
        			//priority_queue<pa3,vector<pa3>,greater<pa3>> pq;            
                     //sort(ve.begin(),ve.end(),greater<int>());
    //    mt19937(clock_per_sec);
      //  mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()) ;
     // a,b,c : positive int   a*b<=c  <=>  a<=c/b
    // 	auto dfs=[&](auto &&self,int r,int p)->int{
	//	};
    class Point{
    	public:
    	double x,y;
    	Point(double x=0,double y=0):x(x),y(y) {}
    	Point operator + (Point p) {return Point(x+p.x,y+p.y);}
    	Point operator - (Point p) {return Point(x-p.x,y-p.y);}
    	Point operator * (double a) {return Point(x*a,y*a);}
    	Point operator / (double a) {return Point(x/a,y/a);}
    	double absv() {return sqrt(norm());}
    	double norm() {return x*x+y*y;}
    	bool operator < (const Point &p) const{
    		return x != p.x ? x<p.x: y<p.y;
    	}
    	bool operator == (const Point &p) const{
    		return fabs(x-p.x)<EPS && fabs(y-p.y)<EPS;
    	}
    };
     
    class Line{
    	public:
    	// y=ax+b
    	double a;
    	double b;
    	Line(double a=0,double b=0):a(a),b(b) {}
    	
    	double eval(double x){return a*x+b;}
    	bool operator < (const Line &p) const{
    		return abs(a-p.a)>EPS ? a<p.a: b<p.b;
    	}
    	
    };
     
    Point intersect_line(Line A,Line B){
    	double x=(B.b-A.b)/(A.a-B.a);
    	return Point(x,A.eval(x));
    }
     
    Line line_from_2_Point(Point A,Point B){
    	// line which through A,B
    	double a=(B.y-A.y)/(B.x-A.x);
    	return Line(a,A.y-a*A.x);
    }
     




struct unionfind{
	private:
	public:
	
vector<int> par,ranks,kosuu;
	
	void shoki(int N){
		par.resize(N+1,0);
		ranks.resize(N+1,0);
		kosuu.resize(N+1,1);
		for(int i=0;i<=N;i++){
			par[i]=i;
		}
	}

	int root(int x){
		return par[x]==x ? x : par[x]=root(par[x]);
	}

	bool same(int x,int y){
		return root(x)==root(y);
	}
	bool is_root(int x){
		return x==root(x);
	}
	void unite(int x,int y){
 		x=root(x);
	 	y=root(y);
		int xx=kosuu[x],yy=kosuu[y];
	 	if(x==y) return;
		if(ranks[x]<ranks[y]){
			par[x]=y;
			kosuu[y]=yy+xx;
		}
	 	else {
			par[y]=x;
			if(ranks[x]==ranks[y]) ranks[x]=ranks[x]+1;
	 		kosuu[x]=yy+xx;
	 	}
		return;
	}
};

int D[3000000];
const int MOD=998244353;
void fourie(int N,int d,vector<int> &vec ){// 1<<d == N
	// Uは順方向ではexp(2pi*I/N)逆だとexp(-2pi*I/N)
	if(N==1){
		return;
	}
	int gyaku=0;
	for(int i=1;i<N;i++){
		int e=1<<(d-1);
		while(gyaku&e){
			gyaku^=e;
			e>>=1;
		}
		gyaku^=e;
		if(i<gyaku)swap(vec[i],vec[gyaku]);	
	}
	for(int c=0;c<d;c++){
		int f=1<<c;
		for(int i=0;i<N;i+=(f<<1)){
			for(int j=i;j<i+f;j++){
				int A1=(vec[j]+vec[j+f]*D[(j-i)<<(d-c-1)])%MOD;
				int A2=(vec[j]-(vec[j+f]*D[(j-i)<<(d-c-1)]%MOD)+MOD)%MOD;
				vec[j]=A1;
				vec[j+f]=A2;
			}
		}
	}
 
	return;
}
 
 
vector<int> NTT(vector<int> input1,vector<int> input2){//MOD=998244353;
int N=1;
	int d=0;
	int size1=input1.size(),size2=input2.size();
	while(N<size1+size2){
		N*=2;
		d++;
	}
	assert(N==(1<<d));
	while((int)input1.size()<N)input1.pb(0);
	while((int)input2.size()<N)input2.pb(0);
	for(auto v:input1){
		if(v<0) v=MOD-((-v)%MOD);
		if(v>=MOD) v%=MOD;
	}
	for(auto v:input2){
		if(v<0) v=MOD-((-v)%MOD);
		if(v>=MOD) v%=MOD;
	}
	// (3^119)^(2^23)=1 mod 998244353
	int g=beki(3,119,MOD);
	for(int i=0;i<23-d;i++)g=(g*g)%MOD;
	
	//cout<<"   "<<beki(g,N,998244353)<<endl;
	
	D[0]=1;
	for(int i=1;i<N;i++){
		D[i]=D[i-1]*g%MOD;
	}
	fourie(N,d,input1);
	fourie(N,d,input2);
	vector<int> ANS;
	
	for(int i=0;i<N;i++)input1[i]=input1[i]*input2[i]%MOD;
	for(int i=1;i<N/2;i++)swap(D[i],D[N-i]);
	
	fourie(N,d,input1);
	int ninv=beki(N,MOD-2,MOD);
	for(int i=0;i<N;i++)input1[i]=input1[i]*ninv%MOD;
	
	for(int i=0;i<size1+size2-1;i++){
		ANS.pb(input1[i]);
	}
	return ANS;
}
void solve(){
	int n,m;
	cin>>n>>m;
	gya(100020);
	vector<int>ve(n+1,0);
	
	for(int i=0;i<=n;i++){
		ve[i]=beki(2,i)+mod-1;
		ve[i]%=mod;
		ve[i]*=inv[i];
		ve[i]%=mod;
	}
	
	vector<int>tmp(1,1);
	
	int ans=0;
	for(int i=1;i<=min(n,m+1);i++){
		tmp=NTT(tmp,ve);
		while((int)tmp.size()>n+1)tmp.pop_back();
		
		int ue=m+1-i;
		if(ue==0){
			ans+=tmp[n];
		}
		else{
			for(int j=0;j<=n;j++){
				ans+=beki(ue,j)*inv[j]%mod*beki(2,j)%mod*tmp[n-j]%mod;
			}
		}
		ans%=mod;
	}
	ans*=pr[n];
	cout<<ans%mod<<endl;
	

}
  
    
    signed main(){
     
    	//mod=inf;
    	cin.tie(0);
    	ios::sync_with_stdio(false);


    	int n=1;
    	//cin>>n;
    	for(int i=0;i<n;i++)solve();

     
    	return 0;
    	
    }
0