http://hihocoder.com/contest/hiho43
前面的可以理解,后面的还需要摸索
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int Mod = 12357;
const int maxn = 1e5 + 5;
const double eps = 0.00000001;
const int INF = 0x3f3f3f3f;
int N, k;
struct Adj{
LL adj[130][130];
Adj friend operator * (Adj a, Adj b) {
Adj c;
memset(c.adj, 0, sizeof(c.adj));
for (int i = 0; i < (1 << k); i ++)
for (int j = 0; j < (1 << k); j ++)
for (int z = 0; z < (1 << k); z ++)
c.adj[i][j] = (c.adj[i][j] + a.adj[i][z] * b.adj[z][j] % Mod) % Mod;
return c;
}
};
void DFS(int y, int x, int col, Adj& c) {
if(col == k) {
c.adj[y][x] = 1;
return ;
}
DFS(x << 1, (y << 1) + 1, col + 1, c);
DFS((x << 1) + 1, y << 1, col + 1, c);
if(col + 2 <= k)
DFS((x << 2) + 3, (y << 2) + 3, col + 2, c);
}
Adj QuickPow(Adj a, int b) {
Adj base = a;
Adj ans;
bool vis = 0;
while(b) {
if(b & 1) {
if(!vis) {
ans = base;
vis = 1;
}
else ans = ans * base;
}
base = base * base;
b >>= 1;
}
return ans;
}
int main()
{
cin >> k >> N;
Adj a, b, c;
memset(c.adj, 0, sizeof(c.adj));
memset(a.adj, 0, sizeof(a.adj));
memset(b.adj, 0, sizeof(b.adj));
c.adj[0][(1 << k) - 1] = 1;
DFS(0, 0, 0, b);
a = QuickPow(b, N);
c = c * a;
cout << c.adj[0][(1 << k) - 1] << endl;
return 0;
}