// compile: g++ -o data data.cpp -std=gnu++20 -DLOCAL -g
// run: ./data < data.in
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#ifdef LOCAL
#endif
#define sz(v) ((int)(v).size())
#define PV(v) for (int i=0;i<v.size();++i)cout<<v[i]<<" ";cout<<endl;
#define int long long
#define MAXN 110
#define MAXM 40
using namespace std;
int n, K, P;
int unlucky = 0;
int add_(int a, int b, int p) {return (a + b) % p; }
int minus_(int a, int b, int p) {return (a - b + p) % p; }
int power(int a, int b, int p) {
if (b == 1) return a % p;
int mid = power(a, b>>1, p);
if (b & 1) return ((mid * mid) * a) % p;
else return (mid * mid) % p;
}
// vector<int> mul(int a[][MAXM], vector<int> &x) {
// vector<int> y(K, 0);
// for (int i = 0; i < K; ++i) {
// for (int j = 0; j < K; ++j) {
// y[i] += a[i][j] * x[j];
// }
// }
// return y;
// }
vector<vector<int>> mul(vector<vector<int>> a, vector<vector<int>> b) {
int n = a.size(), m = b.size(), p = b[0].size();
vector<vector<int>> f(n, vector<int>(p, 0));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < p; ++j) {
for (int k = 0; k < m; ++k) {
f[i][j] = (f[i][j] + ((a[i][k] * b[k][j]) % P)) % P;
}
}
}
return f;
}
vector<vector<int>> mat_pow(vector<vector<int>> a, int n) {
if (n == 1) return a;
vector<vector<int>> mid = mat_pow(a, n >> 1);
if (n & 1) return mul(mul(mid, mid), a);
else return mul(mid, mid);
}
void print_vec(vector<vector<int>> A) {
for (int i = 0; i < K; ++i) {
for (int j = 0; j < K; ++j) {
cout << A[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> K >> P;
for (int s = 0; s < K; ++s) {
cout << s << endl;
vector<vector<int>> A(K, vector<int>(K, 1));
for (int i = 0; i < K; ++i) {
for (int j = 0; j < K; ++j) {
if ((2 * (i-j+K)) % K == s) A[i][j] = 0;
}
}
print_vec(A);
A = mul(A, A);
print_vec(A);
A = mul(A, A);
print_vec(A);
A = mul(A, A);
print_vec(A);
break;
vector<vector<int>> x(K, vector<int>(1, 0));
x[0][0] = 1;
A = mat_pow(A, n);
x = mul(A, x);
unlucky = add_(unlucky, x[s][0], P);
}
int lucky = minus_(power(K, n, P), unlucky, P);
cout << lucky << endl;
return 0;
}
No Comments