第一场TC。
很好的开局。继续努力。
很久没更新,因为被实验室派出国参加NOMS 2014了。整整一个星期,都在波兰的克拉科夫,收获很多,也认识到了自己很多的不足。趁着还能回忆起,这里稍作记录。
一开始是由于投的论文(在多次被拒之后)中了NOMS下的Workshop,QCMan。由于中的是全文,主办方要求作者出席报告,经实验室同意后,便确定了参会。
接下来花了很多时间办相关的手续,从一开始咨询流程,到学校这边的手续、联系主办方寄邀请函,再到备齐材料到大使馆递申请等等。拿到签证前前后后花了大概两个月。真是非常非常麻烦。接下来机票和酒店等等,费用都是实验室承担。万事俱备,5月4号正式出发。
北京到克拉科夫没有直飞。汉莎航空,先是大概10个小时到慕尼黑机场,再转机到克拉科夫。
慕尼黑机场,可惜不能出去。这边是G开头的登机口,貌似都是飞欧洲的航班,候机室有无限量供应的免费咖啡、茶水等等。很长很长的走廊,一眼望不到头:
到克拉科夫已经是深夜12点了。匆匆洗漱后就休息了。
接下来的两天,除了听下会议的keynote(主办方邀请知名专家作报告),基本上都是自由活动了(由于自己不是研究相关方向,以及英语水平的原因,其他作者的报告基本上无法听懂,实在是很惭愧……)。
闲逛时照的一些街景:
瓦维尔山远眺
圣母教堂,游客手册难得有中文版(还是手写的)
老城区的中央集市广场
650年历史的亚盖隆大学,哥白尼的母校哦
第三天,基本上一天都在会场刷题。下午听了同学作的报告。晚上则是主办方组织的晚宴,地点在维利奇卡盐矿。
如维基百科所述,这是一个有着千年历史的老盐矿了。到了之后,是由导游带我们一路讲解,游览到2层(总共9层),到达设在地下深处的宴会大厅。
不得不赞一下这里的导游,在我能听懂的程度内,她对盐矿相关历史的讲解很有趣,看得出她对自己的工作有很深热情。我现在能回忆起来的内容包括:1. 现在盐矿已停止挖掘,但仍在产盐,方式是以抽出积水的形式筛盐,同时地下水也是对盐矿的主要威胁;2. 盐矿下面长期使用马匹,世代在盐矿下繁衍的马竟然回不愿回到地面;3. 很久以前盐矿下就开始使用复杂的机械装置帮助垂直/水平运输物资。
整个晚宴也办得很棒。第一次参加这么正式的宴会,不懂礼节也实在没法。同一桌的也有清华和北航的老师学生。
第四天,主要都是在奥斯威辛集中营参观。
被烧毁的毒气淋浴室,尸体(由于太多)会被集中到后面的森林里焚毁
接下来第5天,(很悲剧的)到我上台作报告了。这里不得不说一下,自己的这篇论文。
读研以来,研究的方向是视频QoE评估。实话说,入学之后的第一次例会,当我清楚项目内容后,就放弃读博士了。很明确地了解到,自己所有的研究工作,都完全没有意义。实验室传统的方向是“网络管理”,但如果要做视频QoE,仅仅从传统的网络层面考虑很难出成果,大家却又都不愿意尝试新思路。指导老师也很早就跟我说,你如果要做图像处理,实验室是没人可以指导你的。
不过,我无论如何都想能学点什么。更何况,从小到大我也是在和学校作对,这次也不能例外。
于是,读了冈萨雷斯的数字图像处理(很多不懂),又自学了OpenCV(基本皮毛)。自己一个人钻研,很痛苦,不懂也没人问;但也很享受,因为毕竟是自己选的。最后,正是在完全闭门造车的情况下拼拼凑凑的写出了这么一篇图像处理方向的QoE论文。实话说,其水平之低,我自己都不忍心多读两遍。但是,3次被拒之后,竟然中了。
QCMan会场上,我是下午第二个作报告。在我前面的是一个奥地利学生,后面则是一个比利时学生。他们的英语水平都很好,形象风趣地阐述着自己的思想,论文质量也远比我的要好。
轮到我上台,只能对着稿子念,生硬死板,一开始还由于没有删掉排练记录的时间而NG了好几次。。。
讲完之后,一位大胡子老师问了我一个问题,还好听懂了,不过回答得也不好(涉及论文缺陷)。。。真的很惭愧,坐下来之后一直在埋怨自己丢人丢到国外来。。。
ps:回来之后还错过了GCJ Round 1C,看着board上大大的一个0分,好难受。本来比赛才应该是最重要的事。接下来要定期打Codeforces了,很多弱点只有通过比赛才能检验,再也没有任何借口。
数论
题意:输入一个最多200*200的行列式a和一个正整数p,求|a|%p。
分析:集训队论文集里《欧几里得算法的应用》的第一道例题。非常巧妙,用GCD思想作模系统下的高斯消元。实现的时候大致要注意以下几点:
(1)尽量减少辗转相除的次数;
(2)尽量少用模运算;
(3)消元过程中算出答案为0提前结束;
(4)尽量避免整行swap;
(5)手动解释输入;
(6)尽量不用long long。
TLE了一整晚后,成功刷入第一版。
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define ll long long int n,p,d[200][200]; ll ans; int gi() { char c; while((c=getchar())!='-'&&(c<'0'||c>'9')); int d,e=1; if(c=='-') { e=-1; c=getchar(); } d=c-'0'; while((c=getchar())>='0'&&c<='9') d=d*10+c-'0'; return d*e; } void init() { ll i,j; ans=1; for(i=0;i<n;i++) { for(j=0;j<n;j++) { d[i][j]=gi(); if(abs(d[i][j])>=p) d[i][j]%=p; if(d[i][j]<0) d[i][j]+=p; } } } void calc(int h,int i,int j) { int k; ll a,e; if(d[i][h]<d[j][h]) swap(i,j); while(d[j][h]) { a=d[i][h]/d[j][h]; for(k=h;k<n;k++) { e=d[i][k]-a*d[j][k]; if(abs(e)>=p) e%=p; if(e<0) e+=p; d[i][k]=e; } if(d[i][h]<d[j][h]) swap(i,j); } } void solve() { int i,j,k,l; for(i=0;i<n;i++) { for(j=i;j<n&&!d[j][i];j++); if(j==n) { puts("0"); return; } if(j>i) { for(l=i;l<n;l++) swap(d[i][l],d[j][l]); ans=-ans; } for(l=i,j=l+1;j<n;j++) { calc(i,j,l); if(!d[l][i]) l=j; } if(l>i) { ans=-ans; for(k=i;k<n;k++) swap(d[i][k],d[l][k]); } } for(i=0;i<n;i++) ans=ans*d[i][i]%p; printf("%lldn",(ans%p+p)%p); } int main() { while(~scanf("%d%d",&n,&p)) { init(); solve(); } return 0; } |