結果
問題 |
No.2062 Sum of Subset mod 999630629
|
ユーザー |
|
提出日時 | 2025-08-24 15:06:24 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 768 ms / 5,000 ms |
コード長 | 7,591 bytes |
コンパイル時間 | 5,730 ms |
コンパイル使用メモリ | 334,656 KB |
実行使用メモリ | 32,104 KB |
最終ジャッジ日時 | 2025-08-24 15:06:37 |
合計ジャッジ時間 | 12,642 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 29 |
ソースコード
#include<bits/stdc++.h> #if __has_include(<atcoder/all>) #include<atcoder/modint> #include<atcoder/lazysegtree> #include<atcoder/convolution> #endif using namespace std; #define eb emplace_back #define done(...) return pp(__VA_ARGS__) #define LL(...) ll __VA_ARGS__;lin(__VA_ARGS__) #define RDVL(T,n,...) vec<T>__VA_ARGS__;fe(refs(__VA_ARGS__),e)e.get().resizes(n);lin(__VA_ARGS__) #define VL(n,...) RDVL(ll,n,__VA_ARGS__) #define fo(i,...) for(auto[i,i##stop,i##step]=for_range<ll>(0,__VA_ARGS__);i<i##stop;i+=i##step) #define fe(a,e,...) for(auto&&__VA_OPT__([)e __VA_OPT__(,__VA_ARGS__]):a) #define binary_operator(op,type) auto operator op(const type&rhs)const{auto copy=*this;return copy op##=rhs;} #define defpp template<ostream&o=cout>void pp(const auto&...a){[[maybe_unused]]const char*c="";((o<<c<<a,c=" "),...);o<<'\n';}void epp(const auto&...a){pp<cerr>(a...);} #define entry defpp void main();void main2();}int main(){my::io();my::main();}namespace my{ #define use_ml998244353 using ml=atcoder::modint998244353; namespace my{ auto&operator<<(ostream&o,const atcoder::modint998244353&x){return o<<(int)x.val();} void io(){cin.tie(nullptr)->sync_with_stdio(0);cout<<fixed<<setprecision(15);} using ll=int; template<class T>concept modulary=requires(T t){t.mod();}; constexpr auto refs(auto&...a){return array{ref(a)...};} template<class T>constexpr auto for_range(T s,T b){T a=0;if(s)swap(a,b);return array{a-s,b,1-s*2};} template<class T>constexpr auto for_range(T s,T a,T b,T c=1){return array{a-s,b,(1-s*2)*c};} void lin(auto&...a){(cin>>...>>a);} constexpr ll powm1(ll n){return 1-2*(n&1);} auto min(auto...a){return min(initializer_list<common_type_t<decltype(a)...>>{a...});} template<class A,class B=A>struct pair{ A a;B b; pair()=default; pair(A aa,B bb):a(aa),b(bb){} auto operator<=>(const pair&)const=default; }; template<class...A>using pack_back_t=tuple_element_t<sizeof...(A)-1,tuple<A...>>; } namespace my{ template<class V>concept vectorial=is_base_of_v<vector<typename remove_cvref_t<V>::value_type>,remove_cvref_t<V>>; template<class V>istream&operator>>(istream&i,vector<V>&v){fe(v,e)i>>e;return i;} template<class V>constexpr int depth=0; template<vectorial V>constexpr int depth<V> =depth<typename V::value_type>+1; template<class T>struct core_t_helper{using type=T;}; template<class T>using core_t=core_t_helper<T>::type; template<class V>struct vec; template<int D,class T>struct hvec_helper{using type=vec<typename hvec_helper<D-1,T>::type>;}; template<class T>struct hvec_helper<0,T>{using type=T;}; template<int D,class T>using hvec=hvec_helper<D,T>::type; template<class V>struct vec:vector<V>{ static constexpr int D=depth<vec<V>>; using C=core_t<V>; using vector<V>::vector; vec(const vector<V>&v):vector<V>(v){} void resizes(const auto&...a){if constexpr(sizeof...(a)==D)*this=make(a...,C{});else{ }} static auto make(ll n,const auto&...a){ if constexpr(sizeof...(a)==1)return vec<C>(n,array{a...}[0]); else { } } ll size()const{return vector<V>::size();} auto&emplace_back(auto&&...a){vector<V>::emplace_back(std::forward<decltype(a)>(a)...);return*this;} auto fold(const auto&f)const{ pair<C,bool>r{}; fe(*this,e){ if constexpr(!vectorial<V>){ if(r.b)f(r.a,e); else r={e,1}; }else { } } return r; } auto sum()const{return fold([](auto&a,const auto&b){a+=b;}).a;} auto max()const{return fold([](auto&a,auto b){if(a<b)a=b;}).a;} auto min()const{return fold([](auto&a,auto b){if(b<a)a=b;}).a;} vec zeta()const{vec v=*this;if constexpr(vectorial<V>){ }fo(i,v.size()-1)v[i+1]+=v[i];return v;} auto count_enumerate(C M=-1)const{ assert(min()>=0); if(M==-1)M=max(); vec<C>res(M+1); auto f=[&]<class U>(auto&f,const vec<U>&v){ fe(v,e){ if constexpr(vectorial<U>){ } else if(e<=M)res[e]++; } }; f(f,*this); return res; } }; template<class...A>requires(sizeof...(A)>=2)vec(const A&...a)->vec<hvec<sizeof...(A)-2,pack_back_t<A...>>>; } namespace my{ template<class T>auto inv_enumerate(ll n){ vec<T>v(n+1); v[0]=0; if(n>=1)v[1]=1; fo(i,2,n+1)v[i]=-v[T::mod()%i]*(T::mod()/i); return v; } } namespace my{ template<class T>T inv(ll n){static vec<T>v{0,1};if(ll m=v.size();m<=n){v.resize(n+1);fo(i,m,n+1)v[i]=-v[T::mod()%i]*(T::mod()/i);}return v[n];} } namespace my{ template<class T>struct formal_power_series:vec<T>{ using vec<T>::vec; using fps=formal_power_series; static constexpr ll SPARSE_THRESHOLD=20; static fps mul(const fps&a,const fps&b){ if constexpr(!modulary<T>){ } else if constexpr(is_same_v<T,atcoder::modint998244353>)return atcoder::convolution(a,b); else { } } fps pre(ll deg)const{fps r(this->begin(),this->begin()+min(this->size(),deg));r.resize(deg);return r;} fps&operator-=(const fps&g){if(g.size()>this->size())this->resize(g.size());fo(i,g.size())(*this)[i]-=g[i];return*this;} fps&operator*=(const fps&g){return*this=(this->size()&&g.size()?mul(*this,g):fps{});} binary_operator(-,fps) binary_operator(*,fps) fps operator-()const{auto r=*this;fe(r,x)x=-x;return r;} fps&operator+=(const T&c){if(!this->size())this->resize(1);(*this)[0]+=c;return*this;} fps&operator*=(const T&c){fo(i,this->size())(*this)[i]*=c;return*this;} binary_operator(+,T) binary_operator(*,T) fps differential()const{ assert(this->size()); fps r(this->size()-1); fo(i,r.size())r[i]=(*this)[i+1]*T{i+1}; return r; } fps integral()const{ fps r(this->size()+1); auto iv=inv_enumerate<T>(r.size()); fo(i,r.size()-1)r[i+1]=(*this)[i]*iv[i+1]; return r; } fps inv_sparse(ll deg=-1)const{ assert((*this)[0]!=T{}); ll n=this->size(); if(deg==-1)deg=n; vec<pair<ll,T>>p; fo(i,1,n)if((*this)[i]!=T{})p.eb(i,(*this)[i]); fps r(deg); r[0]=T{1}/(*this)[0]; fo(i,1,deg){ T t{}; fe(p,k,fk){ if(i-k<0)break; t-=fk*r[i-k]; } r[i]=r[0]*t; } return r; } fps exp_sparse(ll deg=-1)const{ assert((*this)[0]==T{}); ll n=this->size(); if(deg==-1)deg=n; vec<pair<ll,T>>p; fo(i,1,n)if((*this)[i]!=T{})p.eb(i-1,T{i}*(*this)[i]); auto iv=inv_enumerate<T>(deg); fps r(deg); r[0]=1; fo(i,1,deg){ T t{}; fe(p,k,fk){ if(i-k-1<0)break; t+=fk*r[i-k-1]; } r[i]=t*iv[i]; } return r; } ll nonzero_terms_count()const{ll r=0;fe(*this,e)r+=(e!=T{});return r;} fps inv(ll deg=-1)const{ assert((*this)[0]!=T{}); if(deg==-1)deg=this->size(); if(nonzero_terms_count()<SPARSE_THRESHOLD)return inv_sparse(deg); fps r{T{1}/(*this)[0]}; for(ll i=1;i<deg;i<<=1)r=(r*2-this->pre(i<<1)*(r*r)).pre(i<<1); return r.pre(deg); } fps log(ll deg=-1)const{ assert((*this)[0]==T{1}); if(deg==-1)deg=this->size(); return(differential()*inv(deg)).integral().pre(deg); } fps exp(ll deg=-1)const{ assert((*this)[0]==T{}); if(deg==-1)deg=this->size(); if(nonzero_terms_count()<SPARSE_THRESHOLD)return exp_sparse(deg); fps r{1}; for(ll i=1;i<deg;i<<=1)r=(r*(this->pre(i<<1)+T{1}-r.log(i<<1))).pre(i<<1); return r.pre(deg); } }; template<class T>using fps=formal_power_series<T>; } namespace my{entry void main(){ LL(N); VL(N,a); ll P=999630629; ll S=a.sum(); ll M=S-P+1; use_ml998244353 if(M<=1)done(ml(2).pow(N-1)*S); auto c=a.count_enumerate(M); fps<ml>f(M); fo(j,1,M){ fo(n,1,(M-1)/j+1){ f[j*n]+=c[j]*powm1(n)*inv<ml>(n); } } f=(-f).exp(); f=f.zeta(); pp(ml(2).pow(N-1)*S-P*f[M-1]); }}