import java.util.Scanner ; public class Xor_rokicki { static final long MOD = 1000000007 ; static long[][] mul(long[][] a, long[][] b) { int n = a.length ; long[][] r = new long[n][n] ; for (int i=0; i=0; i--) { if (((src >> i) & 1) == 0 && ((dst >> i) & 1) == 0) { if (val == 0) forcezero += mcount ; else if (val == 1) forceone += mcount ; else if ((mcount & 1) == 0) evensets++ ; else oddsets++ ; mcount = 1 ; val = -1 ; } else if (((src >> i) & 1) == 1 && ((dst >> i) & 1) == 1) { mcount++ ; // all equal } else { if (val == 0) { fail = true ; } else if (val == 1 || val == -1) { forceone += mcount ; val = 0 ; } mcount = 1 ; } } if (val == 0) forcezero += mcount ; else if (val == 1) forceone += mcount ; else if ((mcount & 1) == 0) evensets++ ; else oddsets++ ; if (fail) continue ; int reqparity = forceone & 1 ; int res = 1 ; if (oddsets == 0) res = (1 - reqparity) << evensets ; else res = 1 << ((evensets + oddsets) - 1) ; a[src][dst] = res ; } } } long st[][] = new long[n][n] ; for (int i=0; i 0) { if ((K & 1) == 1) r = mul(r, st) ; st = mul(st, st) ; K >>= 1 ; } System.out.println(r[n-1][0]) ; } }