湖南省第十八届大学生计算机程序设计竞赛(HNCPC2022) 题解

摸了两道签到题就润了


D. Big Matrix

题面

先列式子算一下,直接输出答案

可以算出 题目即要求

AC代码:

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
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define lowbit(x) ((x)&-(x))
const int mod=1e9+7;
int main() {
ios::sync_with_stdio(false);
ll n,a1,a2,b1,b2;
while(cin>>n>>a1>>a2>>b1>>b2)
{
ll ans=(n-1)*n*n*n*(2*n-1)/6%mod*a2%mod*b1%mod;
ans+=(n-1)*(n-1)*n*n*n/4%mod*((a1*b1%mod+a2*b2%mod+a1*b2%mod)%mod)%mod;
ans=(ans+mod)%mod;
cout<<ans<<'\n';
}
return 0;
}
/**********************************************************************
Problem: 1192
User: admin_
Language: C++
Result: AC
Time:1 ms
Memory:2332 kb
**********************************************************************/


J. Fibonacci Cane

题面

斐波那契数列有一个性质:

数学归纳法可证,在此不作证明

所以原题就变成找出一部分斐波那契数列的差值

用一定长度的数组存前 k 项数列,然后在这 k 项中两两作差,生成的差值通过map去重,这一步复杂度为 O(k2)

熟知斐波那契数列的通项公式是两个 n 次方项之和,所以斐波那契数列的增长也是挺快的,略微估计一下可知k取 104 足够

AC代码:

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
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=7e3+10;
ll f[N];
const ll Max=1e15;
unordered_map<ll,bool>mp;
int main() {
ios::sync_with_stdio(false);
ll n;
ll a=1,b=1;
for(int i=0;i<N;i++)
{
if(b>Max)
break;
f[i]=a;
ll temp=a+b;
a=b,b=temp;
}
for(int i=1;i<N;i++)
{
for(int j=0;j<i;j++)
mp[f[i]-f[j]]=true;
}
while(cin>>n)
{
if(mp[n]==true)
cout<<"YES"<<'\n';
else
cout<<"NO"<<'\n';
}
return 0;
}
/**********************************************************************
Problem: 1198
User: admin_
Language: C++
Result: AC
Time:253 ms
Memory:2524 kb
**********************************************************************/


img_show