Sat, 09 Feb 2019 22:53:50 GMT

master
大蒟蒻 7 years ago
parent ed9aa51d17
commit 0729180309

@ -71,3 +71,9 @@ multiset搞一下又忘记clear了
很多时候勇于面对事情并不能带来成功,但是如果害怕这种事情的发生而不这样做的话,那就甚至算不上失败了。
回到这个题用一个set来存每个人出的最高价格因为set自带排序可以便捷的求出剩下的人出的最高价格。但是此时我们不能直接输出而是应当找到出价第二高的人的最高出价并且在购得者的出价序列里找一个刚好大于此价格的价格语义上应该使用upper_bound但是在这题的限制里lower_bound也是可以的。
### P - My pretty girl Noora
[原版题解CF822D](http://codeforces.com/blog/entry/53068)
明天再简要翻译一下吧t(天)q(气)l(冷)w(我)s(睡)l(了)。

@ -2,7 +2,30 @@
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
const int N = 5000500, mod = 1e9 + 7;
int minFac[N];
long long dp[N];
int main()
{
for (int i = 0; i < N; i++) minFac[i] = i;
for (int i = 2; i * i < N; i++)
if (minFac[i] == i)
for (int j = i * i; j < N; j += i)
minFac[j] = min(minFac[j], i);
memset(dp, 0x3f, sizeof(dp));
dp[1] = 0;
for (int i = 2; i < N; i++)
for (int x = i; x != 1; x /= minFac[x])
dp[i] = min(dp[i], dp[i / minFac[x]] + i * (minFac[x] - 1ll) / 2);
int t, l, r;
scanf("%d%d%d", &t, &l, &r);
long long ans = 0, cnt = 1;
for (int j = l; j <= r; j++)
{
dp[j] %= mod;
ans = (ans + cnt * dp[j]) % mod;
cnt = (cnt * t) % mod;
}
printf("%lld", ans);
return 0;
}

Loading…
Cancel
Save