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 }
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 }
*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 }
解法三、
官方题解的做法,反正我是惊呆了。
考虑长度是$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 }
*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