前提・実現したいこと
atcoderというプログラミングコンテストをオンラインで開催しているサイトに載っていたこの質問のタイトルにある問題について、自分のソースコードの間違いを指摘して頂けるとありがたいです。標準入力で整数値n(1<=n<=100),D(1<=D<=1e18)が与えられ、絶対誤差1e-6以下で正しい値を出力できれば正解となります。
↓こちらのリンクから問題の詳細が確認できます。
https://beta.atcoder.jp/contests/tdpc/tasks/tdpc_dice
発生している問題・エラーメッセージ
1つのテストケースにのみ正解できていません。(テストケースの中身は全て非公開になっています。)
該当のソースコード
c++
1#include <bits/stdc++.h> 2using namespace std; 3 4#define db double 5#define rep0(i,n) for(int i=0;i<n;i++) 6#define rep1(i,n) for(int i=1;i<=n;i++) 7#define repU(i,bottom,ceiling) for(int (i)=(bottom);(i)<=(ceiling);(i)++) 8#define repD(i,ceiling,bottom) for(int (i)=(ceiling);(i)>=(bottom);(i)--) 9#define V vector 10#define vi vector<int> 11#define pub(v,el) v.push_back(el) 12#define pob(v) v.pop_back 13#define ci(a) cin>>a 14#define lco(a) cout<<a<<endl 15#define co(a) cout<<a 16#define vco(v) rep0(i,v.size()){ co(v[i]<<' '); } co('\n') 17#define pii pair<int,int> 18#define mp(a,b) make_pair(a,b) 19#define fir first 20#define sec second 21 22typedef long long ll; 23 24const int dir[8][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}}; 25const int Inf=2e9+1e8; 26 27template <typename T,typename U> 28pair<T,U> operator+(const pair<T,U> & l,const pair<T,U> & r) { 29 return {l.fir+r.fir,l.sec+r.sec}; 30} 31 32template <typename T,typename U> 33pair<T,U> operator-(const pair<T,U> & l,const pair<T,U> & r) { 34 return {l.fir-r.fir,l.sec-r.sec}; 35} 36 37int order(ll n,int p){ 38 if((ll)n%p) return 0; 39 return 1+order(n/(ll)p,p); 40} 41 42int main(){ 43 int n,p[3]; 44 ll d; 45 ci(n>>d); 46 p[0]=order(d,2); 47 p[1]=order(d,3); 48 p[2]=order(d,5); 49 if(d/(1<<p[0])/pow(3,p[1])/pow(5,p[2])>1){ 50 lco('0'); 51 return 0; 52 } 53 V<V<V<V<db>>>> dp=V<V<V<V<db>>>>(n+1, V<V<V<db>>>(p[0]+1,V<V<db>>(p[1]+1,V<db>(1+p[2],0)))); 54 dp[0][0][0][0]=1; 55 repU(cnt,0,n){ 56 repU(a,0,p[0]){ 57 repU(b,0,p[1]){ 58 repU(c,0,p[2]){ 59 if(!cnt){ if(a||b||c){ dp[cnt][a][b][c]=0; } continue; } 60 dp[cnt][a][b][c]= (dp[cnt-1][a][b][c]+dp[cnt-1][max(0,a-1)][b][c]+dp[cnt-1][a][max(0,b-1)][c]+dp[cnt-1][a][b][max(0,c-1)]+dp[cnt-1][max(0,a-2)][b][c]+dp[cnt-1][max(a-1,0)][max(0,b-1)][c])/6; 61 } 62 } 63 } 64 } 65 printf("%.10f\n",dp[n][p[0]][p[1]][p[2]]); 66 return 0; 67} 68
試したこと
コーナーケースを念入りに確認したつもりです。
補足情報(FW/ツールのバージョンなど)
自前のマクロが激しすぎるせいでバグを誘発しやすい状況にあるように見えるのですが、あえて別言語のようにして回答者の方に見てもらいたいのですか?普通に書かれた方が回答を得やすいかと思われます。一応。
意見ありがとうございます。僕はコーディングスキルが低く、今回のコードのように4次元vectorなどを用いる場合も少なくないため、その宣言等において自分に見やすくするというのが主な目的です。mkgreiさんの意見も踏まえ今後の投稿ではより読みやすいコードを付すことを心がけたいと思います。
回答2件
あなたの回答
tips
プレビュー