結果
| 問題 | No.1448 和差算 |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2026-05-25 14:47:32 |
| 言語 | Go (1.26.1) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,510 bytes |
| 記録 | |
| コンパイル時間 | 17,846 ms |
| コンパイル使用メモリ | 279,848 KB |
| 実行使用メモリ | 7,968 KB |
| 最終ジャッジ日時 | 2026-05-25 14:47:57 |
| 合計ジャッジ時間 | 12,514 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 |
ソースコード
package main
import . "fmt"
import . "math/big"
const M = 1e9+7
func main() {
var a,b,c,d,n int
Scan(&a,&b,&c,&d,&n)
if n == 0 {
ans := (b+d)%M
Println((ans+M)%M)
return
}
var ans int
p := n/4
switch n%4 {
case 0:
if p%2 == 0 {
ans = (b+d)%M
} else {
ans = (a+c)%M
}
case 1:
if p%2 == 0 {
ans = b*2%M
} else {
ans = a*2%M
}
case 2:
if p%2 == 0 {
ans = (b-c)%M*2%M
} else {
ans = (a-d)%M*2%M
}
case 3:
if p%2 == 0 {
ans = -4*c%M
} else {
ans = -4*d%M
}
}
if p > 0 {
k := int(new(Int).Exp(
NewInt(-4),
NewInt(int64(p)),
NewInt(M),
).Int64())
ans = (k*ans)%M
}
Println((ans+M)%M)
}
/*
考察
行列累乗とやらに見える
|a[i]| = |1 -1| * |a[i-1]| = |1 -1| * |1 -1| * |a[i-2]|
|b[i]| |1 1| |b[i-1]| |1 1| |1 1| |b[i-2]|
|1 -1| * |1 -1| = |0 -2| = 2 * |0 -1|
|1 1| |1 1| |2 0| |1 0|
|1 -1| ^ 3 = |0 -2| * |1 -1| = |-2 -2| = 2 * |-1 -1|
|1 1| |2 0| |1 1| | 2 -2| | 1 -1|
|1 -1| ^ 4 = |-2 -2| * |1 -1| = |-4 0| = -4 * |1 0|
|1 1| | 2 -2| |1 1| | 0 -4| |0 1|
4乗で単位行列が出てきちゃったので
5乗(5=1+4)は1乗の-4倍
6乗(6=2+4)は2乗の-4倍
7乗(7=3+4)は3乗の-4倍
8乗(8=4+4)は4乗の-4倍
9乗(9=1+4+4)は1乗の(-4)^2倍
10乗(10=2+4+4)は2乗の(-4)^2倍
11乗(11=3+4+4)は3乗の(-4)^2倍
12乗(12=4+4+4)は4乗の(-4)^2倍
|a[i]| = |1 -1| ^ i * |a[0]|
|b[i]| |1 1| |b[0]|
行列の符号と(-4)^Pの符号との関係を見て
a[0]とb[0]を選べばよい
a[0]はAかBの両端のどっちか
b[0]はCかDの両端のどっちか
だと思うけど、中間の値のほうが良い場合ある?1次式で単調変化ぽい気がするし両端でいい気がするけど
N=(1+4*P)乗の場合
|a[N]| = (-4)^P * |1 -1| * |a[0]|
|b[N]| |1 1| |b[0]|
は
a[N]+b[N] = (-4)^P * ((a[0] - b[0]) + (a[0] + b[0]))
= (-4)^P * 2 * a[0]
N=(2+4*P)乗の場合
|a[N]| = (-4)^P * 2 * |0 -1| * |a[0]|
|b[N]| |1 0| |b[0]|
は
a[N]+b[N] = (-4)^P * 2 * (-b[0] + a[0])
N=(3+4*P)乗の場合
|a[N]| = (-4)^P * 2 * |-1 -1| * |a[0]|
|b[N]| | 1 -1| |b[0]|
は
a[N]+b[N] = (-4)^P * 2 * ((-a[0] - b[0]) + (a[0] - b[0]))
= (-4)^P * 2 * (-2) * b[0]
N=(4+4*P)乗の場合
|a[N]| = (-4)^P * (-4) * |1 0| * |a[0]|
|b[N]| |0 1| |b[0]|
は
a[N]+b[N] = (-4)^(P+1) * (a[0] + b[0])
これ
b[N+1] = a[N]+b[N] だね…
*/
ID 21712