斐波那契数列总结

斐波那契数列总结

斐波那契数列是从0,1开始,后面每一项都是由前面两项相加得到。开头几项是0、1、1、2、3、5、8、13……。在OEIS中是A000045数列。需要注意的是斐波那契数列的第零项是0,第一项是1。本文将探讨总结斐波那契数列的相关问题。

递归定义如下:

$$ F_n = \begin{cases} 0, & n = 0 \\ 1, & n = 1 \\ F_{n-1} + F_{n-2} & n > 1 \end{cases} $$
阅读更多
2020 年「计算机科学与工程学院」新生赛总结

2020 年「计算机科学与工程学院」新生赛总结

第一次作为出题人参与一场算法竞赛,感受还是很不同的。相比与参赛者,少了一些紧张刺激新鲜感,当然也少了一些自闭。

比赛在SCUT CODE上举行,总体而言这个系统做的还是挺不错的,响应迅速,功能齐全。唯一要吐槽的就是题目竟然只能添加不能删除!添加比赛需要一些玄之又玄的操作。还有Special Judge也是非常难配置,还缺少了交互功能。第一场由于没有放特别简单的签到题导致大量选手爆0,导致第二场人数锐减。。。不过第二场比赛的题目最后经过调整还是简单了许多的。下面按难度总结一下这次比赛的题目,目前题目已经全部开放了,可以在题库中找到提交。

第一场比赛链接
第二场比赛链接

阅读更多

给PDF文件添加目录

最近在找一些教材的PDF版本,有时候找到了PDF版本却没有目录,对于教材这种需要经常查阅的电子书来说,没有书签目录会导致效率大大降低。之前一直将就着用了,正好暑假小学期结束了,有一些空闲时间,这次我决定给PDF加上目录。

阅读更多
Markdown学习

Markdown学习

Markdown与标记语言介绍#

Markdown是一种轻量级标记语言。那么什么是标记语言(Markup Language)呢?记得以前在课本上看到关键句子的时候,我通常会用黑笔在句子下面划线,比如下面这样:

当代大学生要坚定理想信念,自觉做中国特色社会主义共同理想的坚定信仰者、忠诚实践者。为此,就要深入学习马克思主义基本原理及马克思主义中国化的理论成果,特别是学习习近平新时代中国特色社会主义思想,让真理武装我们的头脑,让真理指引我们的理想,让真理坚定我们的信仰。要坚持学而信、学而用、学而行,把学习成果转化为不可撼动的理想信念,转化为正确的世界观、人生观、价值观,用理想之光照亮奋斗之路,用信仰之力开创美好未来。当代青年要积极投身新时代中国特色社会主义事业,勇做担当中华民族伟大复兴大任的时代新人。要以勇于担当的精神,做走在新时代前列的奋进者、开拓者、奉献者,以执着的信念、优良的品德、丰富的知识、过硬的本领,同人民群众一道,担负起历史赋予的重任,在实现中华民族伟大复兴中国梦的生动实践中放飞青春梦想。

阅读更多

2019GDCPC总结

OI退役后还是第一次参加这么大型的比赛,感觉还是很不错的。至少比当初NOIP好多了。
同时感觉大学氛围也还是挺不错的。有队友督促训练。
最终差一题,只拿了银,还是有些可惜吧。
一直找不到重现赛或是提交的链接,先记录一下类似的题目吧.
hex

(已经有重现赛了,但是还是没时间补题…)

hello world

hello world

最近上午下午都在搞ACM,晚上实在不想做题,就打起了其他编程语言的主意。虽然编程的水平不能用通晓的编程语言数目来衡量,但多接触一些其他类型的编程语言也可以增长见识,开阔视野,了解一下计算机语言的发展进程。

阅读更多

Codeforces Round 527 (Div. 3)

被自己菜哭::>_<::

A#

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;
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
int a=n/m,b=n%m;
for(int i=1;i<=a;i++){
for(int i=1;i<=m;i++){
cout<<char('a'+i-1);
}
}
for(int i=1;i<=b;i++){
cout<<char('a'+i-1);
}
cout<<endl;
}
return 0;
}

B#

排序后统计相邻元素差值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <bits/stdc++.h>
using namespace std;
int a[105];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
int ans=0;
for(int i=1;i<=n;i+=2){
ans+=a[i+1]-a[i];
}
cout<<ans<<endl;
return 0;
}

C#

利用两个长度为n-1的串把原串找出来,然后逐个判断。

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <bits/stdc++.h>
using namespace std;
char s[205][105];
int len[205],ps[205],markp[105],marks[105];
int main(){
//freopen("input.txt","r",stdin);
int n;
cin>>n;
int m=2*n-2;
int n1=0,n2=0;
for(int i=1;i<=m;i++){
cin>>s[i];
len[i]=strlen(s[i]);
if(len[i]==n-1&&n1==0)n1=i;
else if(len[i]==n-1&&n2==0)n2=i;
}
//printf("n1=%d,n2=%d\n",n1,n2);
int f2=1;
for(int i=1;i<n-1;i++){
if(s[n2][i]!=s[n1][i-1])f2=0;
}
int count=0;
for(int i=1;i<=m;i++){
int ff=1;
for(int j=0;j<len[i];j++){
if(s[i][j]!=s[n2][j]){
ff=0;
break;
}
}
if(ff)count++;
}
if(count<n-1)f2=0;
//printf("f2=%d\n",f2);
char *per,*sur;
per=s[n1],sur=s[n2];
if(f2)swap(per,sur);
for(int i=0;i<n-1;i++){
s[0][i]=per[i];
}
s[0][n-1]=sur[n-2];
len[0]=n;
//printf("s[0]=%s\n",s[0]);
int cs=0,cp=0;
for(int i=1;i<=m;i++){
//prefix
int flagp=1;
for(int j=0;j<len[i];j++){
if(s[i][j]!=s[0][j]){
flagp=0;
break;
}
}
//suffix
int flags=1;
for(int j=0;j<len[i];j++){
if(s[i][j]!=s[0][j+n-len[i]]){
flags=0;
break;
}
}
if(flagp==0){
ps[i]='S';
marks[len[i]]=1;
cs++;
}else if(flags==0){
ps[i]='P';
markp[len[i]]=1;
cp++;
}else ps[i]='A';
}
for(int i=1;i<=m;i++){
if(cp==n-1)break;
if(ps[i]=='A'&&!markp[len[i]]){
ps[i]='P';
cp++;
markp[len[i]]=1;
}
}
for(int i=1;i<=m;i++){
if(cs==n-1)break;
if(ps[i]=='A'&&!marks[len[i]]){
ps[i]='S';
marks[len[i]]=1;
cs++;
}
}
for(int i=1;i<=m;i++){
cout<<char(ps[i]);
}
cout<<endl;
return 0;
}

D1#

D2#

E#

F#

Avito Cool Challenge 2018

题目

A#

A. Definite Game

1
2
3
4
5
6
7
8
9
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
if(n==2)cout<<2<<endl;
else cout<<1<<endl;
return 0;
}

B#

B. Farewell Party

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
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N],b[N];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]=n-a[i];
}
int f=1;
for(int i=1;i<=n;i++){
if(b[i]>0)continue;
b[i]=f;
int count=a[i]-1;
for(int j=i+1;j<=n;j++){
if(count==0)break;
if(b[j]>0)continue;
if(a[j]==a[i]){
b[j]=b[i];
count--;
}
}
if(count>0)f=0;
if(f==0)break;
f++;
}
if(f==0)puts("Impossible");
else{
puts("Possible");
for(int i=1;i<=n;i++){
printf("%d ",b[i]);
}
puts("");
}
return 0;
}

C#

C. Colorful Bricks
he found there are k bricks with a color different from the color of the brick on its left.
n个方块,m种颜色,存在k个方块与左边相邻方块颜色不同,求涂色方案数.
排列组合问题.

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
#include <bits/stdc++.h>
using namespace std;
const int N=2005;
const int MOD=998244353;
int Comn[N][N];
int Com(int n,int m){
for(int i=0;i<=n;i++){
Comn[i][0]=Comn[i][i]=1;
for(int j=1;j<i;j++){
Comn[i][j]=(1ll*Comn[i-1][j]+Comn[i-1][j-1])%MOD;
}
}
return Comn[n][m];
}
int Qpow(int x,int y){
int ans=1;
while(y){
if(y&1)ans=(1ll*ans*x)%MOD;
x=(1ll*x*x)%MOD;
y>>=1;
}
return ans;
}
int main(){
int n,m,k;
//cout<<Com(2,1)<<endl;
cin>>n>>m>>k;
//printf("Com=%d,Qpow=%d\n",Com(n-1,k),Qpow(m-1,k));
cout<<(1ll*Com(n-1,k)*m%MOD*Qpow(m-1,k))%MOD<<endl;
return 0;
}

D#

D. Maximum Distance

E#

E. Missing Numbers
依次尝试平方数。long long真是恶心。

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
#include <bits/stdc++.h>
#define check(x) ((long long)(sqrt(x))*(long long)(sqrt(x))==(x))
using namespace std;
const int N=100005;
const long long M=10000000000000ll;
long long a[N];
int main(){
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int n;
scanf("%d",&n);
for(int i=2;i<=n;i+=2){
scanf("%lld",&a[i]);
}
long long s=0,k=1,f=1;
for(int i=1;i<=n;i+=2){
while(1){
//printf("when k=%lld,s=%lld,check(%lld)=%d\n",k,s,k*k+a[i+1],check(k*k+a[i+1]));
if(k*k>s&&check(k*k+a[i+1])){
a[i]=k*k-s;
s=k*k+a[i+1];
k++;
break;
}
k++;
if(k>1000000){
f=0;
break;
}
}
if(f==0)break;
}
if(f==0)puts("No");
else{
puts("Yes");
for(int i=1;i<=n;i++){
printf("%lld ",a[i]);
}
puts("");
}
return 0;
}

F#

F. Tricky Interactor

G#

G. Mergesort Strikes Back

H#

H. Palindromic Magic

Educational Codeforces Round 56

题目

A#

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
if(n&1)cout<<(n-3)/2+1<<endl;
else cout<<n/2<<endl;
}
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
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
char s[1005];
int c[305]={0};
cin>>s;
int len=strlen(s);
for(int i=0;i<len;i++){
c[s[i]]++;
}
int count=0;
for(int i=0;i<305;i++){
if(c[i]>0)count++;
}
if(count==1)cout<<"-1\n";
else{
for(int i=0;i<305;i++){
if(c[i]>0){
for(int j=0;j<c[i];j++){
cout<<char(i);
}
}
}
cout<<endl;
}
}
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
#include <bits/stdc++.h>
using namespace std;
const int N=200005;
const long long INF=(long long)(1e18+1);
long long a[N];
int main(){
//cout<<(long long)1e18<<endl;
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int n;
cin>>n;
int n2=n/2;
for(int i=1;i<=n2;i++){
cin>>a[n-i+1];
//printf("a[%d]=%lld\n",n-i+1,a[n-i+1]);
}
a[0]=-1;a[n+1]=INF;
for(int i=1;i<=n2;i++){
if(a[i]>=a[i-1]&&a[n-i+1]<=a[n-i+2])continue;
long long temp=max(a[i-1]-a[i],a[n-i+1]-a[n-i+2]);
a[i]+=temp;
a[n-i+1]-=temp;
if(a[i]>a[n-i+1])swap(a[i],a[n-i+1]);
}
for(int i=1;i<=n;i++){
cout<<a[i]<<' ';
}
cout<<endl;
return 0;
}

D#

memset改成手动清零

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
64
65
66
67
68
69
70
71
72
#include <bits/stdc++.h>
using namespace std;
const int N=300005;
const int M=998244353;
vector<int> G[N];
int vis[N],col[N],deg[N];
int cnt[2];
int kpow(int x,int y){
int ans=1;
while(y){
if(y&1)ans=(1ll*ans*x)%M;
x=(1ll*x*x)%M;
y>>=1;
}
return ans;
}
int dfs(int x,int p=0){
//printf("when dfs(%d):\n",x);
vis[x]=1;
col[x]=p;
cnt[p]++;
for(auto i:G[x]){
int f=1;
if(vis[i]&&col[i]==col[x])return 0;
if(!vis[i])f=dfs(i,!p);
if(f==0)return 0;
}
return 1;
}
int main(){
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
G[i].clear();
vis[i]=col[i]=deg[i]=0;
}
//memset(vis,0,sizeof(vis));
//memset(col,0,sizeof(col));
//memset(deg,0,sizeof(deg));
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
deg[u]++,deg[v]++;
}
int f=1,ans=1;
for(int i=1;i<=n;i++){
if(deg[i]==0){
ans=(ans*3ll)%M;
continue;
}
if(!vis[i]){
cnt[0]=cnt[1]=0;
if(!dfs(i))f=0;
else{
//printf("count[0]=%d,count[1]=%d\n",cnt[0],cnt[1]);
ans=(1ll*ans*(kpow(2,cnt[0])+kpow(2,cnt[1])))%M;
}
}
if(f==0)break;
}
if(f==0)puts("0");
else printf("%d\n",ans);
}
return 0;
}

E#

F#

G#