#define _USE_MATH_DEFINES #include using namespace std; using ul = unsigned long long; using ll = long long; using ld = long double; using pll = pair; #define in(v,c) ((c).find(v) != (c).end()) #define F(i,n) for(ll i = 0; i < (n); i++) #define Fun(i,n) for(ul i = 0; i < (n); i++) #ifdef GPD templatevoid lerr(F&&f){cerr<(f)<void lerr(F&&f,R&&...r){cerr<(f)<<' ';lerr(forward(r)...);} #else #define lerr(...) #endif const ll mod = 1e9+7; struct Mod { ll x; Mod(ll xx): x(xx) {} Mod(): x(-1){} Mod operator+(Mod b)const {return Mod((x+b.x)%mod);} Mod operator-(Mod b)const{return Mod((x-b.x+mod)% mod);} Mod operator*(Mod b)const{return Mod((x*b.x)%mod);} bool operator == (Mod b){ return x == b.x; } bool operator != (Mod b){ return x != b.x; } }; ll K, N; // N, start, end unordered_map>> DP; Mod frec(ll start, ll end, ll n){ if(n == 2){ return __gcd(start, end) == 1 ? 1 :0; } if(DP.count(n) == 1 && DP[n][start][end] != -1){ return DP[n][start][end]; } Mod sum = 0; ll leftn = (n+1)/2; ll rightn = n-leftn + 1; for(ll p = 1; p <= K; ++p){ Mod left = frec(start, p, leftn); Mod right = frec(p, end, rightn); Mod onesum = left * right; sum = sum + onesum; } if(DP.count(n) == 0){ DP[n] = vector>(K+1, vector(K+1, -1)); } DP[n][start][end] = sum; return sum; } int main(int argc, char const *argv[]) { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); cout << setprecision(9) << fixed; lerr("ready"); lerr(mod); cin >> K >> N; if(N == 1){ cout << K << endl; return 0; } Mod sum = 0; for(ll start = 1; start <= K; ++start){ for(ll end = 1; end <= K; ++end){ sum = sum + frec(start, end, N); } } cout << sum.x << endl; return 0; }