Submission #6237059
Source Code Expand
#include <bits/stdc++.h> #define rep(i, a, b) for (ll i = (a); i < (b); i++) typedef uint64_t ull; typedef int64_t ll; typedef std::pair<ll, ll> PLL; using namespace std; ll N, K; ll M = 1000000007; vector<ll> gids; // グループID一覧 vector<ll> sizes; // gid_ix => グループの要素数 vector<vector<ll>> dp; // dp[i][gid_ix]: i個の並べた時に、最後の数が gid に属する vector<vector<ll>> memo; ll f (ll i, ll gid_ix) { //if (gid_ix >= gids.size()) // return 0; auto gid = gids[gid_ix]; // static map<PLL, ll> memo; //if (memo.find(make_pair(i, gid_ix)) != memo.end()) // return memo[make_pair(i, gid_ix)]; if (memo[i][gid_ix] != -1) return memo[i][gid_ix]; // cout<<"gid="<<gid<<endl; ll res; if (i == 0) res = 0; else if (gid == 0) res = 0; // need? else if (gid == N) res = dp[i][gids.size()-1]; else res = f(i, gid_ix+1) + (dp[i][gid_ix] * sizes[gid_ix]) %M; // cout<<"i="<<i<<" gid="<<gid<<endl; res %= M; return memo[i][gid_ix] = res; } signed main() { cin >> N >> K; for (int x = 1; x * x <= N; x++) { gids.push_back(x); gids.push_back(N/x); } sort(begin(gids), end(gids)); gids.erase(unique(begin(gids), end(gids)), end(gids)); sizes.resize(gids.size()); // cout<<"max gid="<<gids[gids.size()-1]<<endl; for (int i = 0; i < gids.size()-1; i++) { sizes[i] = N/gids[i] - N/gids[i+1]; sizes[i] %= M; } sizes[gids.size()-1] = 1; // for (auto p: sizes) { // cout<<"gid="<<p.first<<" size="<<p.second<<endl; // cout<<"gid="<<p.first<<" next_gid="<<next_gid[p.first]<<endl; // } // cout<<"gids.size()="<<gids.size()<<endl; dp.resize(K+1, vector<ll>(gids.size()+1)); memo.resize(K+1, vector<ll>(gids.size()+1, -1)); for (int gid_ix = 0; gid_ix < gids.size(); gid_ix++) { dp[1][gid_ix] = 1; // printf("dp[%d][%d] = %d\n", 1, gid, dp[1][gid]); } for (int i=2; i<=K; i++) { // for (int x = 1; x <= N; x++) { // for (auto gid: gids) { for (int gid_ix=gids.size()-1; gid_ix>=0; gid_ix--) { auto gid = gids[gid_ix]; dp[i][gid_ix] = f(i-1, gids.size()-1 - gid_ix) %M; // printf("dp[%d][%d] = %d\n", i, x, dp[i][x]); } } ll ans = 0; for (int gid_ix = 0; gid_ix < gids.size(); gid_ix++) { auto gid = gids[gid_ix]; ans += (dp[K][gid_ix] * sizes[gid_ix])%M; ans %= M; } cout << ans << endl; return 0; }
Submission Info
Submission Time | |
---|---|
Task | F - Small Products |
User | bobuhiro11 |
Language | C++14 (GCC 5.4.1) |
Score | 600 |
Code Size | 2500 Byte |
Status | AC |
Exec Time | 318 ms |
Memory | 103688 KiB |
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 600 / 600 | ||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | s1.txt, s2.txt, s3.txt |
All | 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, s1.txt, s2.txt, s3.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
01.txt | AC | 318 ms | 103688 KiB |
02.txt | AC | 269 ms | 88224 KiB |
03.txt | AC | 278 ms | 91040 KiB |
04.txt | AC | 293 ms | 95776 KiB |
05.txt | AC | 127 ms | 41480 KiB |
06.txt | AC | 1 ms | 256 KiB |
09.txt | AC | 277 ms | 90944 KiB |
10.txt | AC | 1 ms | 256 KiB |
11.txt | AC | 99 ms | 32588 KiB |
12.txt | AC | 90 ms | 29772 KiB |
13.txt | AC | 77 ms | 25548 KiB |
14.txt | AC | 1 ms | 256 KiB |
s1.txt | AC | 1 ms | 256 KiB |
s2.txt | AC | 1 ms | 256 KiB |
s3.txt | AC | 65 ms | 22240 KiB |