yukicoder No.64 XORフィボナッチ数列

Problem

No.64 XORフィボナッチ数列 - yukicoder

Solution

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] inputs = reader.readLine().split(" ");
        long f0 = Long.parseLong(inputs[0]);
        long f1 = Long.parseLong(inputs[1]);
        long N = Long.parseLong(inputs[2]);
        long f2 = f1 ^ f0;
        long[] fs = new long[3];
        fs[0] = f0;
        fs[1] = f1;
        fs[2] = f2;
        for (long i = 3; i <= N; i++) {
            fs[0] = fs[2] ^ fs[1];
            fs[1] = fs[2];
            fs[2] = fs[0];
        }

        if(N < 3) {
            System.out.println(fs[(int) N]);
        } else {
            System.out.println(fs[0]);
        }
    }

}

上のようなことをやっているとTLEになってしまうので、パターンを見つけて ループを使わない方法を考える。 漸化式をk=0からk=6まで考えてみると以下のようになる。 f0 f1 f2 = f1 ^ f0 f3 = f2 ^ f1 = f1 ^ f0 ^ f1 = f1 ^ f1 ^ f0 = 0 ^ f0 = f0 f4 = f3 ^ f2 = f0 ^ f1 ^ f0 = 0 ^ f1 = f1 f5 = f4 ^ f3 = f0 ^ f1 = f1 ^ f0 f6 = f5 ^ f4 = f1 ^ f0 ^ f1 = f1 ^ f0 ^ f1 = 0 ^ f0 = f0 以上から fk = f0 (if k mod 3 == 0) = f1 (if k mod 3 == 1) = f1 ^ f0 (if k mod 3 == 2) のようになることがわかる。 あとは実装するだけ。

Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String[] inputs = reader.readLine().split(" ");
        long f0 = Long.parseLong(inputs[0]);
        long f1 = Long.parseLong(inputs[1]);
        long N = Long.parseLong(inputs[2]);
        long[] fs = new long[3];
        fs[0] = f0;
        fs[1] = f1;
        fs[2] = f1 ^ f0;
        System.out.println(fs[(int)(N % 3)]);

    }

}