結果
| 問題 | No.1073 無限すごろく | 
| コンテスト | |
| ユーザー |  semisagi | 
| 提出日時 | 2020-06-05 22:34:51 | 
| 言語 | Swift (6.0.3) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 9 ms / 2,000 ms | 
| コード長 | 3,120 bytes | 
| コンパイル時間 | 1,364 ms | 
| コンパイル使用メモリ | 132,276 KB | 
| 実行使用メモリ | 9,472 KB | 
| 最終ジャッジ日時 | 2024-11-30 18:26:23 | 
| 合計ジャッジ時間 | 2,647 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 30 | 
ソースコード
class Scanner {
    private var stack = [String]()
    private var index = 0
    
    func peek() -> String {
        if stack.count == index {
            stack += readLine()!.split(separator: " ").map{ String($0) }
        }
        return stack[index]
    }
    
    func next() -> String {
        let value = peek()
        index += 1
        return value
    }
    
    func nextInt() -> Int {
        return Int(next())!
    }
    
    func nextDouble() -> Double {
        return Double(next())!
    }
}
extension String {
    var characters: [Character] {
        self.map{ $0 }
    }
}
let mod = 1000000007
struct Modulo {
    let n: Int
    
    init(_ n: Int) {
        self.n = n
    }
    
    static func +(lhs: Self, rhs: Self) -> Self {
        return Modulo((lhs.n + rhs.n) % mod)
    }
    
    static func -(lhs: Self, rhs: Self) -> Self {
        return Modulo((lhs.n + mod - rhs.n) % mod)
    }
    
    static func *(lhs: Self, rhs: Self) -> Self {
        return Modulo((lhs.n * rhs.n) % mod)
    }
    
    static func +=(lhs: inout Self, rhs: Self) {
        lhs = lhs + rhs
    }
    
    static func -=(lhs: inout Self, rhs: Self) {
        lhs = lhs - rhs
    }
    
    static func *=(lhs: inout Self, rhs: Self) {
        lhs = lhs * rhs
    }
    
    func inverse() -> Self {
        // x * self = 1 (mod P) となるxを求める。
        // exists y, x * self - 1 = P*yと同値。
        // x*self - P*y = 1
        var x1 = 1, y1 = 0, z1 = n
        var x2 = 0, y2 = 1, z2 = -mod
        while z2 != 0 {
            let q = z1 / z2
            x1 -= x2 * q
            y1 -= y2 * q
            z1 -= z2 * q
            swap(&x1, &x2)
            swap(&y1, &y2)
            swap(&z1, &z2)
        }
        x1 %= mod
        if x1 < 0 {
            x1 += mod
        }
        return Modulo(x1)
    }
}
let sixth = Modulo(6).inverse()
struct Polynomial {
    let a: [Modulo]
    
    init(_ a: [Modulo]) {
        self.a = a
    }
    
    init(_ a: [Int]) {
        self.a = a.map(Modulo.init)
    }
    
    static var zero: Polynomial {
        get {
            Polynomial([0, 0, 0, 0, 0, 0])
        }
    }
    
    static var one: Polynomial {
        get {
            Polynomial([1, 0, 0, 0, 0, 0])
        }
    }
    
    subscript(index: Int) -> Modulo {
        a[index]
    }
    
    static func *(lhs: Self, rhs: Self) -> Self {
        var c = Array.init(repeating: Modulo(0), count: 11)
        for i in 0 ... 5 {
            for j in 0 ... 5 {
                c[i + j] += lhs[i] * rhs[j]
            }
        }
        for i in (6 ... 10).reversed() {
            for j in 0 ... 5 {
                c[i - 6 + j] += c[i] * sixth
            }
        }
        return Polynomial(Array(c[0 ... 5]))
    }
    
    func power(_ n: Int) -> Polynomial {
        if n == 0 { return .one }
        let value = power(n / 2)
        if n % 2 == 0 {
            return value * value
        } else {
            return value * value * self
        }
    }
}
var scanner = Scanner()
let N = scanner.nextInt()
print(Polynomial([0, 1, 0, 0, 0, 0]).power(N + 5)[5].n)
            
            
            
        