// compile: g++ -o data data.cpp -std=gnu++20 -DLOCAL
// 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 dp[MAXN][MAXM];
int power(int a, int b) {
int s = 1;
for (int i = 0; i < b; ++i) s = (s * a) % P;
return s;
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> K >> P;
int bad = 0;
for (int s = 0; s < K; ++s) {
// exclude s
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < K; ++j) {
for (int k = 0; k < K; ++k) {
if ((2*k) % K == s) continue;
int bit = (j - k + K) % K;
dp[i][j] = (dp[i][j] + dp[i-1][bit]) % P;
}
}
}
cout << dp[n][s] << endl;
bad = (bad + dp[n][s]) % P;
}
cout << (power(K, n) - bad + P) % P << endl;
return 0;
}
No Comments