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

摸了两道签到题就润了


D. Big Matrix

题面

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

可以算出

题目即要求

AC代码:

#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

题面

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

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

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

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

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

AC代码:

#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