回答編集履歴

7

edit

2018/01/23 08:54

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -96,13 +96,19 @@
96
96
 
97
97
  大変遅かったのでnC2にすることにしました。
98
98
 
99
+ 可読性は落ちましたが、m倍早くなりました。
100
+
101
+ たぶんね。
102
+
103
+
104
+
99
105
  ```python
100
106
 
101
107
  from itertools import combinations as comb
102
108
 
103
109
  def get_ans(m, n):
104
110
 
105
- ans = sum(1 for nums in comb(range(1, min(m+1,n-2)), 2) if ((n-sum(nums)>0) and (n-sum(nums) > max(nums)) and (n-sum(nums)<=m)))
111
+ ans = sum(1 for nums in comb(range(1, min(m+1,n-2)), 2) if ((n-sum(nums)>0) and (n-sum(nums)>max(nums)) and (n-sum(nums)<=m)))
106
112
 
107
113
  return ans
108
114
 

6

修正

2018/01/23 08:54

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -87,3 +87,37 @@
87
87
  print(ans)
88
88
 
89
89
  ```
90
+
91
+
92
+
93
+ ---
94
+
95
+
96
+
97
+ 大変遅かったのでnC2にすることにしました。
98
+
99
+ ```python
100
+
101
+ from itertools import combinations as comb
102
+
103
+ def get_ans(m, n):
104
+
105
+ ans = sum(1 for nums in comb(range(1, min(m+1,n-2)), 2) if ((n-sum(nums)>0) and (n-sum(nums) > max(nums)) and (n-sum(nums)<=m)))
106
+
107
+ return ans
108
+
109
+
110
+
111
+ while True:
112
+
113
+ m, n = (int(x) for x in input().split())
114
+
115
+ if m==0 and n==0:
116
+
117
+ quit()
118
+
119
+ ans = get_ans(m, n)
120
+
121
+ print(ans)
122
+
123
+ ```

5

修正

2018/01/23 08:47

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -68,7 +68,7 @@
68
68
 
69
69
  def get_ans(m, n):
70
70
 
71
- ans = sum(1 for nums in comb(list(range(1, min(m+1,n-2))), 3) if sum(nums)==n)
71
+ ans = sum(1 for nums in comb(range(1, min(m+1,n-2)), 3) if sum(nums)==n)
72
72
 
73
73
  return ans
74
74
 

4

修正

2018/01/23 08:29

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -53,3 +53,37 @@
53
53
  get_ans(m, n)
54
54
 
55
55
  ```
56
+
57
+
58
+
59
+ ---
60
+
61
+
62
+
63
+ python的最適化。
64
+
65
+ ```python
66
+
67
+ from itertools import combinations as comb
68
+
69
+ def get_ans(m, n):
70
+
71
+ ans = sum(1 for nums in comb(list(range(1, min(m+1,n-2))), 3) if sum(nums)==n)
72
+
73
+ return ans
74
+
75
+
76
+
77
+ while True:
78
+
79
+ m, n = (int(x) for x in input().split())
80
+
81
+ if m==0 and n==0:
82
+
83
+ quit()
84
+
85
+ ans = get_ans(m, n)
86
+
87
+ print(ans)
88
+
89
+ ```

3

edit

2018/01/23 08:27

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -9,6 +9,8 @@
9
9
  https://docs.python.jp/3/library/itertools.html#itertools.combinations
10
10
 
11
11
  コンビネーションを使えば、3つの数字が同じになるものは探索しなくてすみます。
12
+
13
+ (実際は探索空間が6分の1くらいに減るのですが)
12
14
 
13
15
 
14
16
 

2

edit

2018/01/23 08:17

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -1,4 +1,6 @@
1
1
  満たさないものを弾くのではなく、数え上げた方が探索空間が少ないです。
2
+
3
+ (nC3とn^3どっちが大きいのかという話です。)
2
4
 
3
5
 
4
6
 

1

Edit

2018/01/23 08:14

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -11,3 +11,41 @@
11
11
 
12
12
 
13
13
  それとinp[0]>inp[1]は探索しなくて良いはずです。
14
+
15
+
16
+
17
+ ---
18
+
19
+
20
+
21
+ たとえばこんなやつ。
22
+
23
+ ```python
24
+
25
+ from itertools import combinations as comb
26
+
27
+ def get_ans(m, n):
28
+
29
+ ans = 0
30
+
31
+ for nums in comb(list(range(1, min(m+1,n-2))), 3):
32
+
33
+ if sum(nums) == n:
34
+
35
+ ans += 1
36
+
37
+ print(ans)
38
+
39
+
40
+
41
+ while True:
42
+
43
+ m, n = (int(x) for x in input().split())
44
+
45
+ if m==0 and n==0:
46
+
47
+ quit()
48
+
49
+ get_ans(m, n)
50
+
51
+ ```