title : 2021暨南大学轩辕杯ACM程序设计新生赛
date : 2021-12-12
tags : ACM,练习记录
author : Linno
题目链接:https://ac.nowcoder.com/acm/contest/26008
进度:10/13
总结
难度比较适合新生,基本上都有出题,而难题上限也很高,共5道题没人过,最高过题数8道。
我不是出题人,如果大家没有需要的话这份题解不会更了。
排在前面有很多大佬啊,如果下面题解有问题希望可以对我提出指正。
A.残秋挽歌
题意
给一个长度为n的字符串,如果存在出现次数大于n/2个’a‘,那么输出原字符串,否则反转输出。
思路
签到题。记录a的个数就可了。复杂度O(n)O(n)O(n)
代码
cin>>n;
cin>>str;
for(int i=0;i<n;i++){
if(str[i]=='a'){
num++;
}
}
if(num>n/2) for(int i=n-1;i>=0;i--) cout<<str[i];
else for(int i=0;i<n;i++) cout<<str[i];
B.突 发 恶 疾
题面
输出斐波那契第n项模998244353
思路
签到题+1。递推求斐波那契数列,边推边模。复杂度O(n)O(n)O(n)
代码
cin>>n;
f[0]=0;f[1]=1;
for(int i=2;i<=n;i++) f[i]=(f[i-1]+f[i-2])%mod;
cout<<f[n]<<"\n";
C.突 发 恶 疾 plus
题面
把上一题的n数据范围调到1e18,且最多有1e5组数据。
来源:https://www.luogu.com.cn/problem/P4000
思路
使用矩阵快速幂。复杂度O(tlogn)O(tlogn)O(tlogn)
简单讲解:
Fn=Fn−1+Fn−2Fn−1=Fn−2+Fn−3[FnFn−1]=[(Fn−1+Fn−2)Fn−1]=[Fn−1Fn−2][1110]所以[FnFn−1]=[F2F1][1110]n−2 F_n=F_{n-1}+F_{n-2} \\ F_{n-1}=F_{n-2}+F_{n-3}\\ [F_n\quad F_{n-1}]=[(F_{n-1}+F_{n-2})\quad F_{n-1}]=[F_{n-1}\quad F_{n-2}]\begin{bmatrix}1&1\\1&0\end{bmatrix}\\ 所以[F_n\quad F_{n-1}]=[F_2\quad F_1]\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-2} Fn=Fn−1+Fn−2Fn−1=Fn−2+Fn−3[FnFn−1]=[(Fn−1+Fn−2)Fn−1]=[Fn−1Fn−2][1110]所以[FnFn−1]=[F2F1][1110]n−2
前置知识:快速幂
int fpow(int a,int b,int mod){
int res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
代码
#include<bits/stdc++.h>
#define int long