codeforces Educational Round 80

Posted aya-uchida

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces Educational Round 80相关的知识,希望对你有一定的参考价值。


A、Deadline

题意:

完成一个计划需要$d$天,但是可以优化,优化$x$天的情况下,完成时间是$x+lceil frac{d}{x+1} ceil$天。求$n$天内能否完成?

题解:

枚举天数即可,显然只需要枚举到$sqrt(d)$,如果可行马上输出。直接计算也可以,但是博主不会

AC代码:

技术图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e5 + 5;
 4 void solve()
 5 {
 6     int n, d;
 7     scanf("%d%d", &n, &d);
 8     for (int i = 0; i * i <= d; ++i)
 9     {
10         int ans = 0;
11         if (d % (i + 1))
12             ans = d / (i + 1) + 1 + i;
13         else
14             ans = d / (i + 1) + i;
15         if (n >= ans)
16         {
17             puts("YES");
18             return;
19         }
20     }
21     puts("NO");
22 }
23 int main()
24 {
25     int T;
26     scanf("%d", &T);
27     while (T--)
28         solve();
29     return 0;
30 }
View Code

B、Yet Another Meme Problem

题意:

数字$a$范围在$[1,A]$,$b$范围在$[1,B]$,将$a$和$b$拼接起来,求这个数字等于$a*b+a+b$的值时,$a$和$b$取值的对数。

题解:

我们令$b$的位数是$k$,则$con(a,b) = a*10^k+b$,然后化简得$b=10^k-1$时即可。所以就找符合的$b$即可,此时$a$任意。

AC代码:

技术图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 1e5 + 5;
 5 void solve()
 6 {
 7     ll n, m;
 8     scanf("%lld%lld", &n, &m);
 9     ll cnt = 0;
10     for (ll i = 10; i - 1 <= m; i *= 10)
11         ++cnt;
12     printf("%lld
", cnt * n);
13 }
14 int main()
15 {
16     int T;
17     scanf("%d", &T);
18     while (T--)
19         solve();
20     return 0;
21 }
View Code

*C、Two Arrays

题意:

给出$n$和$m$,求出长度都是$m$的序列$a$和$b$,使得对于所有的$1 leq i leq m$:$a_i leq n, b_i leq n, a_i leq a_{i+1},b_i geq b_{i+1},a_i leq b_i$。

题解:

解法一、

令$dp[i][j][k]$表示第$i$位,$a_i$是$j$,$b_i$是$k$的方案数,转移方程:

$dp[i][j][k] = sum limits _{j‘ =1}^{j} sum limits _{k‘ = n}^{k} dp[i-1][j‘][k‘] * (k-j+2)*(k-j+1)/2$

然后考虑用二维前缀和优化,同时可以优化掉第一维。

AC代码:

暂无$QAQ$

解法二、

令$dp[i][j]$表示第$i$个数的$b_i-a_i=j$的方案数,转移方程:

$dp[i][j] = sum limits _{k = j}^{n-1} dp[i-1][k]*(k-j+1)$

可以使用前缀和优化,但是不优化也能过。

AC代码:

技术图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 1e3 + 5, M = 1e1 + 5;
 5 const ll mod = 1e9 + 7;
 6 ll dp[M][N], sum[N];
 7 void solve()
 8 {
 9     int n, m;
10     scanf("%d%d", &n, &m);
11     for (int i = 0; i < n; ++i)
12         dp[1][i] = n - i;
13     for (int i = 2; i <= m; ++i)
14         for (int j = 0; j < n; ++j)
15             for (int k = j; k < n; ++k)
16                 dp[i][j] = (dp[i][j] + dp[i - 1][k] * (k - j + 1)) % mod;
17     ll ans = 0;
18     for (int i = 0; i < n; ++i)
19         ans = (ans + dp[m][i]) % mod;
20     printf("%lld
", ans);
21 }
22 int main()
23 {
24     int T = 1;
25     //scanf("%d", &T);
26     while (T--)
27         solve();
28     return 0;
29 }
View Code

解法三、

官方题解的做法,反正我是惊呆了。

考虑长度是$2*m$的序列$a_1,a_2,...,a_m,b_m,...b_2,b_1$,这个序列是单调不降的,等价于从$1$到$n$中选择$2*m$个数组成的可重集的数量的和。所以答案就是$C_{n+2*m-1}^{2*m}$

取模求个逆元就行。

AC代码:

技术图片
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 1.1e3 + 5;
 5 const ll mod = 1e9 + 7;
 6 ll pow(ll a, ll b, ll p)
 7 {
 8     ll res = 1;
 9     while (b)
10     {
11         if (b & 1)
12             res = res * a % p;
13         a = a * a % p;
14         b >>= 1;
15     }
16     return res;
17 }
18 ll fac[N];
19 void solve()
20 {
21     fac[0] = 1;
22     for (int i = 1; i < N; ++i)
23         fac[i] = fac[i - 1] * i % mod;
24     int n, m;
25     scanf("%d%d", &n, &m);
26     printf("%lld
", fac[n + 2 * m - 1] * pow(fac[n - 1], mod - 2, mod) % mod * pow(fac[2 * m], mod - 2, mod) % mod);
27 }
28 int main()
29 {
30     int T = 1;
31     //scanf("%d", &T);
32     while (T--)
33         solve();
34     return 0;
35 }
View Code

 

*D、Minimax Problem

题意:

题解:

AC代码

E、Messenger Simulator

题意:

题解:

AC代码

 

以上是关于codeforces Educational Round 80的主要内容,如果未能解决你的问题,请参考以下文章

Educational Codeforces Round 7 A

Educational Codeforces Round 7

Codeforces Educational Codeforces Round 54 题解

Educational Codeforces Round 90

Educational Codeforces Round 33

Educational Codeforces Round 27