結果
問題 |
No.2057 Ising Model
|
ユーザー |
![]() |
提出日時 | 2025-05-12 02:10:00 |
言語 | Go (1.23.4) |
結果 |
AC
|
実行時間 | 20 ms / 2,000 ms |
コード長 | 2,048 bytes |
コンパイル時間 | 12,822 ms |
コンパイル使用メモリ | 249,108 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-05-12 02:10:17 |
合計ジャッジ時間 | 15,649 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 44 |
ソースコード
package main import . "fmt" func main() { var n,a,b int Scan(&n,&a,&b) ans:=solve(n,a,b) Println(ans) } func solve(n, a, b int) int { // S = [1, 1, 1, 1, 1, 1, 1, ... , 1] // ans = A*(N-1) - B*N // S = [1, -1, 1, -1, 1, -1, 1, ... , -1, 1] (N is odd) // ans = -A*(N-1) - B // S = [1, -1, 1, -1, 1, -1, 1, ... , -1] (N is even) // ans = -A*(N-1) ans := min(a*(n-1)-b*n,-a*(n-1)-b*(n%2)) // S = [1, -1, 1, -1, ... , 1, -1, 1, 1, ... , 1, 1, 1, 1] // S = [-1, 1, -1, 1, ... , 1, -1, 1, 1, ... , 1, 1, 1, 1] // p | N-p // 1 <= i < p : S[i] = -S[i+1] // p <= i <= N : S[i] = 1 // p is odd // 1 <= i <= p: -A*(p-1) - B // p < i <= N: A*(N-p) - B*(N-p) // f(S{p}) = -A*(p-1) - B + A*(N-p) - B*(N-p) // = A*(N-2*p+1) - B*(N-p+1) // p is even // 1 <= i <= p: -A*(p-1) // p < i <= N: A*(N-p) - B*(N-p) // f(S{p}) = -A*(p-1) + A*(N-p) - B*(N-p) // = A*(N-2*p+1) - B*(N-p) // // f(S{p+2}) - f(S{p}) = -4*A + 2*B < 0 // -> 2*A > B // // f(S{p+2}) - f(S{p}) = -4*A + 2*B > 0 // -> 2*A < B // // f(S{p+2}) - f(S{p}) = -4A + 2*B == 0 // -> 2*A == B // { p := n-1 if p % 2 == 0 { ans = min(ans, a*(n-2*p+1)-b*(n-p)) } else { ans = min(ans, a*(n-2*p+1)-b*(n-p+1)) } } return ans } func init() { check() } func check() { for n := 10; n < 13; n++ { for a := n-2; a <= n+2; a++ { for b := n-2; b <= n+2; b++ { ans1 := solve(n,a,b) ans2, f := bruteforce(n, a, b) if ans1 != ans2 { panic(Sprintf("n=%d,a=%d,b=%d,ans1=%d,ans2=%d,f=%b",n,a,b,ans1,ans2,f)) } } } } } func bruteforce(n, a, b int) (int, int) { if n > 20 { panic("N > 20") } ans := a*(n-1) - b * n f := (1<<n)-1 for i := 0; i < (1<<n); i++ { tmp := 0 for j := 0; j < n-1; j++ { s1 := 2*((i>>j)&1)-1 s2 := 2*((i>>(j+1))&1)-1 tmp += a * s1*s2 } for j := 0; j < n; j++ { s := 2*((i>>j)&1)-1 tmp -= b * s } if tmp < ans { ans = tmp f = i } } return ans, f }