結果
問題 |
No.584 赤、緑、青の色塗り
|
ユーザー |
|
提出日時 | 2017-10-27 23:25:24 |
言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 6 |
other | AC * 13 TLE * 1 |
コンパイルメッセージ
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; }