湖南省第十七届大学生计算机程序设计竞赛(HNCPC2021

A.签到题,用map嵌个结构体。

B.对于满足即可

C.直接暴力做,但用map被卡常,而数据又有点大,考虑到题面保证给的数据是递增的,用二分查找来判断是否存在。

D.先处理好的逆元env,然后对于每个问询,先算出,然后每次乘于左端逆元与新右端点。需注意


A:
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
struct  A
{
int c,j,z;
};

LL t;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>t;
f(sb,1,t){
map<char ,A> m;
f(i,1,15){
char na,nb;
int a,b,c,d;
cin>>na>>nb>>a>>b>>c>>d;
if(a>b){
m[na].c+=3,m[na].j+=(a-b),m[na].z+=a;
m[nb].j+=(b-a),m[nb].z+=b;
}
else if(a==b){
m[na].c+=1,m[na].j+=(a-b),m[na].z+=a;
m[nb].c+=1,m[nb].j+=(b-a),m[nb].z+=b;
}
else{
m[nb].c+=3,m[na].j+=(a-b),m[na].z+=a;
m[nb].j+=(b-a),m[nb].z+=b;
}
a=c,b=d;
if(a>b){
m[na].c+=3,m[na].j+=(a-b),m[na].z+=a;
m[nb].j+=(b-a),m[nb].z+=b;
}
else if(a==b){
m[na].c+=1,m[na].j+=(a-b),m[na].z+=a;
m[nb].c+=1,m[nb].j+=(b-a),m[nb].z+=b;
}
else{
m[nb].c+=3,m[na].j+=(a-b),m[na].z+=a;
m[nb].j+=(b-a),m[nb].z+=b;
}
}
f(i,0,5){
char d='A'+i;
cout<<m[d].c<<" "<<m[d].j<<" "<<m[d].z<<"\n";
}
}
return 0;
}

B:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LL tt, n, m, r, c, v;
int main()
{
while (scanf("%lld%lld%lld%lld%lld", &n, &m, &r, &c, &v) == 5)
{
if (r * c <= v && n * m - v + 1 >= (n - r + 1) * (m - c + 1))
{
cout << "Yes\n";
}
else
cout << "No\n";
}
return 0;
}

C:

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
LL n, x;
int main()
{
while (scanf("%lld", &n) == 1)
{
vi tar, a;
f(i, 0, n - 1) scanf("%lld", &x), tar.pb(2 * x), a.pb(x);
for (auto s = tar.begin(); s != tar.end();)
{
int flag = 1;
f(i, 0, n-1)
{
if (2 * a[i] != *s)
{
auto dd = lower_bound(all(a), *s - a[i]);
if (dd != a.end() && *dd == *s - a[i])
{
s = tar.erase(s);
flag = 0;
break;
}
}
}
if (flag)
s += 1;
}
cout<<n-tar.size() << "\n";
}
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
const LL pp = 1e9 + 7,N=1e6+9;
LL n, m,env[N];

LL pow_mod(LL a, LL b, LL p)
{
LL ret = 1;
while (b)
{
if (b & 1)
ret = (ret * a) % p;
a = (a * a) % p;
b >>= 1;
}
return ret;
}
LL Fermat(LL a, LL p)
{
return pow_mod(a, p - 2, p);
}

int main()
{
f(i,1,1e6){
env[i]=Fermat(i,pp);
}
while (scanf("%lld%lld", &n, &m) == 2)
{
LL ans=0,te;
te = 1;
f(i, 1, m)
{
te *= i;
te %= pp;
}
ans += te;
ans %= pp;
f(j, 1, n - 1)
{

te *= env[j];
te %= pp;
te *= (j + m);
te %= pp;
ans += te;
ans %= pp;
}
cout << ans << "\n";
}
return 0;
}