hihor 学习日记:hiho一下 第四十三周 (拓展)

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;
}

猜你喜欢

转载自blog.csdn.net/henu_jizhideqingwa/article/details/84977571