結果
| 問題 |
No.2953 Maximum Right Triangle
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-11-16 00:09:47 |
| 言語 | Fortran (gFortran 14.2.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,225 bytes |
| コンパイル時間 | 1,414 ms |
| コンパイル使用メモリ | 31,804 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-16 00:09:49 |
| 合計ジャッジ時間 | 919 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 2 WA * 4 |
ソースコード
!> This file was processed by `fypp`.
!> Today's fortune: "Bad WA", really OK?
!> ランダムウォーク猿「'因数分解' で はっぴー.」
program f902953
use, intrinsic :: iso_fortran_env
!> auto use module
implicit none
integer(int32) :: t
integer(int32) :: i
read(input_unit, *) t
do i = 1, t
call solve()
end do
contains
impure subroutine solve()
integer(int64) :: d, x, y
integer(int64) :: g, nx, ny
read(input_unit, *) d, x, y
if (x == 0) then
write(output_unit, '(i0)') y * d
return
else if (y == 0) then
write(output_unit, '(i0)') x * d
return
end if
!> (nx, ny) == (y, -x) /g ベクトルは (x, y) ベクトルに垂直.
g = gcd(x, y)
nx = y / g
ny = - x / g
if (nx < 0) then
nx = - nx
ny = - ny
end if
block
!> (x, y)
!> nx >= 0.
!> x + t * nx <= d.
integer(int64) :: ans
integer(int64) :: bx, by
ans = 0_int64
associate(t => (d - x) / nx)
!> x + t * nx <= d
if (t > 0) then
bx = x + t * nx
by = y + t * ny
if (0 <= by .and. by <= d) then
ans = max(ans, t * (x ** 2 + y ** 2))
end if
end if
end associate
associate(t => x / nx)
!> x - t * nx >= 0
if (t > 0) then
bx = x - t * nx
by = y - t * ny
if (0 <= by .and. by <= d) then
ans = max(ans, t * (x ** 2 + y ** 2))
end if
end if
end associate
associate(t => (d - y) / abs(ny))
if (ny > 0) then
!> y + t * ny <= d
if (t > 0) then
bx = x + t * nx
by = y + t * ny
if (0 <= bx .and. bx <= d) then
ans = max(ans, t * (x ** 2 + y ** 2))
end if
end if
else
!> y + t * abs(ny) <= d
if (t > 0) then
bx = x - t * nx
by = y + t * abs(ny)
if (0 <= bx .and. bx <= d) then
ans = max(ans, t * (x ** 2 + y ** 2))
end if
end if
end if
end associate
associate(t => y / abs(ny))
if (ny > 0) then
!> y - t * ny >= 0
if (t > 0) then
bx = x - t * nx
by = y - t * ny
if (0 <= bx .and. bx <= d) then
ans = max(ans, t * (x ** 2 + y ** 2))
end if
end if
else
!> y - t * abs(ny) >= d
if (t > 0) then
bx = x + t * nx
by = y - t * abs(ny)
if (0 <= bx .and. bx <= d) then
ans = max(ans, t * (x ** 2 + y ** 2))
end if
end if
end if
end associate
write(output_unit, '(i0)') ans
end block
end subroutine solve
pure integer(int64) function gcd(a, b) result(res)
integer(int64), intent(in) :: a, b
integer(int64) :: arr(1:2)
arr(1:2) = [max(abs(a), abs(b)), min(abs(a), abs(b))]
do while (arr(2) /= 0)
arr(1:2) = [arr(2), mod(arr(1), arr(2))]
end do
res = arr(1)
end function gcd
end program f902953