結果
問題 | No.584 赤、緑、青の色塗り |
ユーザー | ryoissy |
提出日時 | 2017-10-27 23:25:24 |
言語 | C++11 (gcc 11.4.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,931 bytes |
コンパイル時間 | 1,945 ms |
コンパイル使用メモリ | 161,640 KB |
実行使用メモリ | 10,496 KB |
最終ジャッジ日時 | 2024-11-21 23:18:36 |
合計ジャッジ時間 | 6,076 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 23 ms
10,496 KB |
testcase_01 | AC | 23 ms
5,248 KB |
testcase_02 | AC | 23 ms
5,248 KB |
testcase_03 | AC | 23 ms
5,248 KB |
testcase_04 | AC | 23 ms
5,248 KB |
testcase_05 | AC | 23 ms
5,248 KB |
testcase_06 | AC | 22 ms
5,248 KB |
testcase_07 | AC | 22 ms
5,248 KB |
testcase_08 | AC | 23 ms
5,248 KB |
testcase_09 | AC | 22 ms
5,248 KB |
testcase_10 | AC | 22 ms
5,376 KB |
testcase_11 | AC | 23 ms
5,248 KB |
testcase_12 | AC | 22 ms
5,248 KB |
testcase_13 | AC | 23 ms
5,248 KB |
testcase_14 | AC | 84 ms
5,248 KB |
testcase_15 | AC | 114 ms
5,248 KB |
testcase_16 | AC | 24 ms
5,248 KB |
testcase_17 | AC | 24 ms
5,248 KB |
testcase_18 | AC | 23 ms
5,248 KB |
testcase_19 | TLE | - |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:63:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 63 | scanf("%d%d%d%d",&n,&r,&g,&b); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> #define MOD 1000000007LL using namespace std; typedef long long ll; typedef pair<int,int> P; ll fact[100001]; ll fact_inv[100001]; ll twop[5001]; ll extgcd(ll a,ll b,ll& x,ll& y){ ll d=a; if(b!=0LL){ d=extgcd(b,a%b,y,x); y-=(a/b)*x; }else{ x=1; y=0; } return d; } ll mod_inverse(ll a,ll m){ ll x,y; extgcd(a,m,x,y); return (m+x%m)%m; } ll mod_fact(ll n,ll p,ll& e){ e=0; if(n==0)return 1; ll res=mod_fact(n/p,p,e); e+=n/p; if(n/p%2!=0){ return res*(p-fact[n%p])%p; } return res*fact[n%p]%p; } ll mod_comb(ll n,ll k,ll p){ if(n<0 || k<0 || n<k)return 0; ll e1,e2,e3; ll a1=mod_fact(n,p,e1),a2=mod_fact(k,p,e2),a3=mod_fact(n-k,p,e3); if(e1>e2+e3)return 0; return a1*mod_inverse(a2*a3%p,p)%p; } int n,r,g,b; int main(void){ fact[0]=1; for(ll i=1;i<=100000;i++){ fact[i]=fact[i-1]*i%MOD; } fact_inv[0]=1; for(ll i=1;i<=100000;i++){ fact_inv[i]=fact_inv[i-1]*mod_inverse(i,MOD)%MOD; } twop[0]=1; for(int i=1;i<=3000;i++){ twop[i]=twop[i-1]*2LL%MOD; } scanf("%d%d%d%d",&n,&r,&g,&b); ll ans=0; for(int i=0;i<=min(r,g);i++){ if(i*3-1>n)continue; for(int j=0;j<=min(b,r-i);j++){ if((i+j)*3-1>n)continue; for(int k=0;k<=min(g-i,b-j);k++){ int restr=r-i-j; int restb=b-j-k; int restg=g-i-k; if((i+j+k)*3+(restr+restb+restg)*2-1>n)continue; int rest=n-((i+j+k)*3+(restr+restb+restg)*2-1); ll ck=fact[i+j+k+restr+restb+restg]; ck=ck*fact_inv[i+j+k]%MOD; ck=ck*fact_inv[restr+restb+restg]%MOD; ll cb=fact[i+j+k]; cb=cb*fact_inv[i]%MOD; cb=cb*fact_inv[j]%MOD; cb=cb*fact_inv[k]%MOD; ll ci=fact[restr+restb+restg]; ci=ci*fact_inv[restr]%MOD; ci=ci*fact_inv[restb]%MOD; ci=ci*fact_inv[restg]%MOD; ck=ck*cb%MOD; ck=ck*ci%MOD; ck=ck*twop[i+j+k]%MOD; ck=ck*mod_comb(rest+i+j+k+restr+restg+restb,rest,MOD)%MOD; ans=(ans+ck)%MOD; } } } printf("%lld\n",ans); return 0; }