結果
問題 | No.940 ワープ ε=ε=ε=ε=ε=│;p>д<│ |
ユーザー | latte0119 |
提出日時 | 2019-12-04 15:04:56 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 117 ms / 5,000 ms |
コード長 | 4,121 bytes |
コンパイル時間 | 1,355 ms |
コンパイル使用メモリ | 162,704 KB |
実行使用メモリ | 45,952 KB |
最終ジャッジ日時 | 2024-11-30 15:43:29 |
合計ジャッジ時間 | 4,783 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 86 ms
36,480 KB |
testcase_01 | AC | 85 ms
36,608 KB |
testcase_02 | AC | 85 ms
36,480 KB |
testcase_03 | AC | 87 ms
36,480 KB |
testcase_04 | AC | 87 ms
36,480 KB |
testcase_05 | AC | 87 ms
36,480 KB |
testcase_06 | AC | 87 ms
36,608 KB |
testcase_07 | AC | 88 ms
36,608 KB |
testcase_08 | AC | 86 ms
36,352 KB |
testcase_09 | AC | 86 ms
36,608 KB |
testcase_10 | AC | 88 ms
36,480 KB |
testcase_11 | AC | 86 ms
36,480 KB |
testcase_12 | AC | 89 ms
36,608 KB |
testcase_13 | AC | 89 ms
36,480 KB |
testcase_14 | AC | 87 ms
36,480 KB |
testcase_15 | AC | 90 ms
37,120 KB |
testcase_16 | AC | 92 ms
38,528 KB |
testcase_17 | AC | 97 ms
40,576 KB |
testcase_18 | AC | 102 ms
41,984 KB |
testcase_19 | AC | 98 ms
40,704 KB |
testcase_20 | AC | 103 ms
43,392 KB |
testcase_21 | AC | 96 ms
39,168 KB |
testcase_22 | AC | 104 ms
43,264 KB |
testcase_23 | AC | 95 ms
38,784 KB |
testcase_24 | AC | 105 ms
43,392 KB |
testcase_25 | AC | 116 ms
44,672 KB |
testcase_26 | AC | 117 ms
45,952 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; #define int long long #define rep(i,n) for(int i=0;i<(n);i++) #define reps(i,a,b) for(int i=(a);i<(b);i++) #define pb push_back #define eb emplace_back #define all(v) (v).begin(),(v).end() #define fi first #define se second using vint=vector<int>; using pint=pair<int,int>; using vpint=vector<pint>; template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;} template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;} template<class A,class B> ostream& operator<<(ostream& ost,const pair<A,B>&p){ ost<<"{"<<p.first<<","<<p.second<<"}"; return ost; } template<class T> ostream& operator<<(ostream& ost,const vector<T>&v){ ost<<"{"; for(int i=0;i<v.size();i++){ if(i)ost<<","; ost<<v[i]; } ost<<"}"; return ost; } template<uint32_t mod> struct ModInt{ uint32_t a; ModInt& s(uint32_t vv){ a=vv<mod?vv:vv-mod; return *this; } ModInt(int64_t x=0){s(x%mod+mod);} ModInt& operator+=(const ModInt &x){return s(a+x.a);} ModInt& operator-=(const ModInt &x){return s(a+mod-x.a);} ModInt& operator*=(const ModInt &x){ a=uint64_t(a)*x.a%mod; return *this; } ModInt& operator/=(const ModInt &x){ *this*=x.inv(); return *this; } ModInt operator+(const ModInt &x)const{return ModInt(*this)+=x;} ModInt operator-(const ModInt &x)const{return ModInt(*this)-=x;} ModInt operator*(const ModInt &x)const{return ModInt(*this)*=x;} ModInt operator/(const ModInt &x)const{return ModInt(*this)/=x;} bool operator==(const ModInt &x)const{return a==x.a;} bool operator!=(const ModInt &x)const{return a!=x.a;} bool operator<(const ModInt &x)const{return a<x.a;} ModInt operator-()const{return ModInt()-*this;} ModInt pow(int64_t n)const{ ModInt res(1),x(*this); while(n){ if(n&1)res*=x; x*=x; n>>=1; } return res; } ModInt inv()const{return pow(mod-2);} }; template<uint32_t mod> istream& operator>>(istream& in,const ModInt<mod>& a){ return (in>>a.a); } template<uint32_t mod> ostream& operator<<(ostream& out,const ModInt<mod>& a){ return (out<<a.a); } using mint=ModInt<1000000007>; template<class Mint,int32_t lg> struct ModIntTable{ int N; vector<Mint>facts,finvs,invs; ModIntTable():N(1<<lg),facts(N),finvs(N),invs(N){ const uint32_t mod=Mint(-1).a+1; invs[1]=1; for(int i=2;i<N;i++)invs[i]=invs[mod%i]*(mod-mod/i); facts[0]=1; finvs[0]=1; for(int i=1;i<N;i++){ facts[i]=facts[i-1]*i; finvs[i]=finvs[i-1]*invs[i]; } } inline Mint fact(int n)const{return facts[n];} inline Mint finv(int n)const{return finvs[n];} inline Mint inv(int n)const{return invs[n];} inline Mint binom(int n,int k)const{return facts[n]*finvs[k]*finvs[n-k];} inline Mint perm(int n,int k)const{return facts[n]*finvs[n-k];} }; ModIntTable<mint,21>mtable; mint po[2222222]; signed main(){ po[0]=1; for(int i=1;i<2222222;i++)po[i]=po[i-1]*2; int X,Y,Z; cin>>X>>Y>>Z; if(X==0&&Y==0&&Z==0){ cout<<1<<endl; return 0; } int N=X+Y+Z; mint coef=po[N+1]; if((N+1)&1)coef*=-1; vector<mint>p(N+2); for(int i=0;i<=N+1;i++){ p[i]=coef*mtable.binom(N+1,i); if((N+1-i)&1)p[i]*=-1; } p[0]-=1; vector<mint>q(N+1); mint b=mint(2).inv(); for(int i=N;i>=0;i--){ mint c=p[i+1]*b; q[i]=c; p[i]+=c; } mint ans=0; for(int i=0;i<=N;i++){ if(i<X||i<Y||i<Z)continue; mint tmp=q[i]; tmp*=mtable.binom(i,X); tmp*=mtable.binom(i,Y); tmp*=mtable.binom(i,Z); ans+=tmp; } if(X&1)ans*=-1; if(Y&1)ans*=-1; if(Z&1)ans*=-1; ans/=2; ans*=-1; cout<<ans<<endl; return 0; }