AtCoder Beginner Contest 042

A

题目大意:

判断输入的三个数字是不是 5,5,7。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main()
{
vector<int>a(4);
int cnt=0;
int sum=0;
for(int i=1;i<=3;i++)
{
cin>>a[i];
if(a[i]==5)
{
cnt++;
}
if(a[i]==7)
{
sum++;
}
}
if(cnt==2&&sum==1)
{
cout<<"YES"<<"\n";
}
else
{
cout<<"NO"<<'\n';
}
return 0;
}

B

题目大意:

给出若干个字符串,如何首位拼接得到字典序最小的字符串。

直接排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main()
{
int n;
cin>>n;
int l;
cin>>l;
vector<string>s(n+1);
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
sort(s.begin()+1,s.end());
for(int i=1;i<=n;i++)
{
cout<<s[i];
}
cout<<'\n';
return 0;
}

C

题目大意:

给出数字的使用限制,用剩下的数字拼成大于等于 n 的数并输出。

暴力写即可,枚举+check

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
{
int n, k;
cin >> n >> k;
vector<int> vis(100);
for (int i = 1; i <= k; i++)
{
int x;
cin >> x;
vis[x] = 1;
}
for (int i = n; i <= 1000000; i++)
{
int x = i;
bool flag = 0;
while (x)
{
if (vis[x % 10])
{
flag = 1;
break;
}
x /= 10;
}
if (!flag)
{
cout << i << '\n';
return 0;
}
}

return 0;
}

D

很经典的问题,从一个表格的左上角走到右下角有几种走法 (只能向下或者向右)。用组合数解决即可。

不过加入了禁区,那么就先走到禁区那最后一列的那些行的下一列,然后走到终点,相当于两次组合数。

组合数用阶乘+快速幂+逆元即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 2e5 + 10;
const ll mod = 1e9 + 7;
ll inv[maxn], fac[maxn]; // 分别表示逆元和阶乘
// 快速幂
ll quickPow(ll a, ll b)
{
ll ans = 1;
while (b)
{
if (b & 1)
ans = (ans * a) % mod;
b >>= 1;
a = (a * a) % mod;
}
return ans;
}

void init()
{
// 求阶乘
fac[0] = 1;
for (int i = 1; i <= maxn; i++)
{
fac[i] = fac[i - 1] * i % mod;
}
// 求逆元
inv[maxn - 1] = quickPow(fac[maxn - 1], mod - 2);
for (int i = maxn - 2; i >= 0; i--)
{
inv[i] = inv[i + 1] * (i + 1) % mod;
}
}
ll C(int n, int m)
{
if (m > n)
{
return 0;
}
if (m == 0)
return 1;
return fac[n] * inv[m] % mod * inv[n - m] % mod;
}
ll get(ll a, ll b, ll c, ll d)
{
return C(c - a + d - b, c - a) % mod;
}
int main()
{
init();
ll h, w;
ll a, b;
cin >> h >> w >> a >> b;
ll ans = 0;
for (int i = 1; i <= h - a; i++)
{
ans = (ans + get(1, 1, i, b) * get(i, b + 1, h, w) % mod) % mod;
}
cout << ans << '\n';
return 0;
}