回答編集履歴

1

追記

2022/11/18 09:22

投稿

can110
can110

スコア38266

test CHANGED
@@ -79,4 +79,55 @@
79
79
  15143571行
80
80
  """
81
81
  ```
82
+ ## 追記
82
83
 
84
+ C++で総数だけ数える雑なコード書いてみましたが、40程度でも数分かかって6901580871通りとはじき出されたので、50個ものパターンをじっさいに生成するのは現実的ではないと思います。
85
+ ```C++
86
+ #include <stdio.h>
87
+ #include <string.h>
88
+ #include <stdlib.h>
89
+ #include <vector>
90
+
91
+ using namespace std;
92
+
93
+ const int TOTAL = 40;
94
+ const int MAX0 = 4;
95
+ const int MAX2 = 4;
96
+
97
+ long long nCount = 0;
98
+
99
+ void count( int aCount[], int aRet[])
100
+ {
101
+ if( aCount[0] <= 0 && aCount[1] <= 0 && aCount[2] <= 0){
102
+ nCount++;
103
+ return;
104
+ }
105
+
106
+ int pos = TOTAL - (aCount[0] + aCount[1] + aCount[2]);
107
+ for( int i = 0; i < 3; i++){
108
+ if( aCount[i] > 0){
109
+ int aCount_next[3];
110
+ memcpy( aCount_next, aCount, sizeof(aCount_next));
111
+ aCount_next[i]--;
112
+ aRet[pos] = i;
113
+ count(aCount_next, aRet);
114
+ }
115
+ }
116
+ }
117
+
118
+ int main( int argc, char *argv[])
119
+ {
120
+ int aRet[TOTAL];
121
+ for( int n0 = 0; n0 <= MAX0; n0++){
122
+ for( int n2 = 0; n2 <= MAX2; n2++){
123
+ int n1 = TOTAL - n0 - n2;
124
+ int aCount[3] = {n0, n1, n2};
125
+ printf("%d,%d,%d\n", aCount[0], aCount[1], aCount[2]);
126
+ count( aCount, aRet);
127
+ printf("%lld\n", nCount);
128
+ }
129
+ }
130
+
131
+ return 0;
132
+ }
133
+ ```