#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector vi; typedef vector vvi; typedef pair pii; #define all(c) (c).begin(), (c).end() #define loop(i,a,b) for(ll i=a; iDUMP &operator,(const T&t){if(this->tellp())*this<<", ";*this< ostream& operator<<(ostream& os, vector const& v){ rep(i,v.size()) os << v[i] << (i+1==v.size()?"":" "); return os; } const ll mod = 1000000000; const int MAX_N = 10000; // nCr % mod ll nCr(int n, int r){ static bool done[MAX_N+1][MAX_N/2+2]; static ll dp[MAX_N+1][MAX_N/2+2]; if (n < 0 || r < 0 || n < r) return 0; if (r==0) return 1; if (r > n-r) r = n-r; ll &res = dp[n][r]; if (done[n][r]) return res; done[n][r] = true; return res = (nCr(n-1,r-1) + nCr(n-1,r))%mod; } int main(){ ll N,M; while(cin>>N>>M){ N/=1000; ll rem = N-N/M*M; dump(M,rem); cout << nCr(M,rem) << endl; } }