Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define F first
- #define S second
- #define pb push_back
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- #define ordered_set tree<pair<ll,int>, null_type,less<pair<ll,int>>, rb_tree_tag,tree_order_statistics_node_update>
- using namespace std;
- typedef long long ll;
- const int MOD = 1e9 + 7;
- const int mxK = 1e5 + 9;
- const int mxN = 1e2 + 9;
- const int INF = 1e7 + 7;
- const double eps = 1e-7;
- ll dp1[mxN][mxK], dp2[mxN][mxK], pre1[mxN][mxK], suff2[mxN][mxK], cnt[mxK];
- void solve () {
- int N, K;
- cin >> N >> K;
- int n = sqrt (N);
- for (int j = 1; j <= n; j++) {
- int r = N / j;
- int l = ceil (N / (j + 1.0));
- if (l * (j + 1) == N)
- l++;
- cnt[j] = r - l + 1;
- dp1[1][j] = 1;
- dp2[1][j] = cnt[j];
- pre1[1][j] = pre1[1][j - 1] + dp1[1][j];
- }
- for (int j = n; j >= 1; j--)
- suff2[1][j] = suff2[1][j + 1] + dp2[1][j];
- for (int i = 2; i <= K; i++) {
- for (int j = 1; j <= n; j++) {
- dp1[i][j] = suff2[i - 1][j] + pre1[i - 1][n];
- dp2[i][j] = pre1[i - 1][j] * cnt[j];
- pre1[i][j] = pre1[i][j - 1] + dp1[i][j];
- }
- for (int j = n; j >= 1; j--)
- suff2[i][j] = suff2[i][j + 1] + dp2[i][j];
- }
- ll res = 0;
- for (int j = 1; j <= n; j++) {
- //cout << dp1[K][j] << ' ' << dp2[K][j] << "\n";
- res += dp1[K][j] + dp2[K][j];
- }
- cout << res << "\n";
- }
- int main () {
- int t = 1;
- //cin >> t;
- //preCalc ();
- while (t--)
- solve ();
- return 0;
- }
- /*
- ((2?3)?8)
- 1 1
- *
- *
- * */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement