/* HP Template is SJTU's * Square root is using manually square root * reference on baike.baidu.com */ #define MaxStrLen 1005 #define MaxAnsLen 505 HP ans[MaxAnsLen]; int ansLen; void ManualSqrt(char* s) { int strLen=strlen(s),num,l,i; ansLen = 0; HP sq,rem,di,tmp,tmp2; HP hundred,twenty,ten,one; Int2HP(100, hundred); Int2HP(20, twenty); Int2HP(10, ten); Int2HP(1, one); bool first=true; if(strLen&1) { num=s[0]-48; l=1; } else { num=(s[0]-48)*10+(s[1]-48); l=2; } // sq = (int)sqrt(num) Int2HP((int)sqrt((double)num), sq); ans[ansLen++]=sq; while(l<strLen) { Int2HP((s[l]-48)*10+s[l+1]-48, tmp); if(first) { // rem = (num-sq*sq)*100 + (s[l]-48)*10 + (s[l+1]-48) first=false; Int2HP(num, tmp2); Multi(sq,sq,rem); Subtract(tmp2, rem, rem); Multi(rem, hundred, rem); Plus(rem, tmp, rem); } else { // rem = (rem - (sq*20+di)*di)*100 + (s[l]-48)*10 + (s[l+1]-48) Multi(twenty, sq, tmp2); Plus(tmp2, di, tmp2); Multi(tmp2, di, tmp2); Subtract(rem, tmp2, rem); Multi(rem, hundred, rem); Plus(rem, tmp, rem); //sq=sq*10+di; Multi(sq, ten, sq); Plus(sq, di, sq); } //di=(rem/(20*sq)); Multi(twenty, sq, tmp2); Divide(rem, tmp2, di, tmp); while(1) { //while((sq*20+di)*di>rem) Multi(sq, twenty, tmp2); Plus(tmp2, di, tmp2); Multi(tmp2, di, tmp2); if(HPCompare(tmp2, rem) <=0) break; Subtract(di, one, di); } ans[ansLen++] = di; l+=2; } //output ans for(int i=0;i<ansLen;i++) PrintHP(ans[i]); printf("\n"); } |
Tag Archives: 2011
SGU 110 – 3D Gemo Practice
/* Good Gemo Pratice * No reference, CSCI3260 is helpful! * Line - Sphere intersection * Point - Line distance * Reflection vector compute * WA on 6: should intersect the very first sphere in the direction */ #include <cstdio> #include <algorithm> #include <cmath> using namespace std; #define EPS 1e-9 #define feq(x,y) (fabs((x)-(y))<EPS) #define fgt(x,y) ((x)>((y)+EPS)) #define fge(x,y) (((x)+EPS)>(y)) typedef struct Pt{ double x,y,z,r; Pt(){} Pt(double x,double y,double z):x(x),y(y),z(z){} Pt operator+(const Pt&p){ return Pt(x+p.x,y+p.y,z+p.z); } Pt operator-(const Pt&p){ return Pt(x-p.x,y-p.y,z-p.z); } Pt operator*(double k){ return Pt(x*k,y*k,z*k); } double operator*(const Pt&p){ return x*p.x+y*p.y+z*p.z; } Pt operator^(const Pt&p){ return Pt(y*p.z-z*p.y, z*p.x-x*p.z, x*p.y-y*p.x); } double len2(){ return x*x+y*y+z*z; } double len(){ return sqrt(len2()); } bool operator==(const Pt&p){ return feq(x,p.x)&&feq(y,p.y)&&feq(z,p.z); } void eat(){ scanf("%lf%lf%lf",&x,&y,&z); } void out(){ printf("(%lf,%lf,%lf)\n",x,y,z); } } Pt; double P2Ldist(Pt P, Pt A, Pt B) { return ((P-A)^(B-A)).len() / (B-A).len(); } bool L2Sinter(Pt A, Pt B, Pt S, Pt& insP, double& tt) { Pt norm = (B-A)*(1/(B-A).len()); double a,b,c,delta,t1,t2; a=norm.len2(); b=2*(norm*(A-S)); c=(A-S).len2()-S.r*S.r; delta = b*b - 4*a*c; t1 = (-b-sqrt(delta))/(2*a); if(fgt(t1,0)) { insP = A+norm*t1; tt = t1; return true; } else return false; } Pt newDir(Pt V, Pt N) { N = N*(1/N.len()); return V-N*(2*(V*N)); } int main() { int n,pos; double tt,mint; Pt s[55],A,B,insP,nDIR,recP; scanf("%d",&n); for(int i=1;i<=n;i++) { s[i].eat(); scanf("%lf",&s[i].r); } A.eat(); B.eat(); bool never=false; int refcnt=0; while(refcnt <= 10) { never=true; mint=1000000000; for(int i=1;i<=n;i++) { if(fge(s[i].r, P2Ldist(s[i],A,B))) if(L2Sinter(A,B,s[i],insP,tt)) { never=false; if(fgt(mint, tt)) { pos=i; recP=insP; mint=tt; } } } if(never) break; else { refcnt++; if(refcnt>10) printf("etc.\n"); else printf("%d ",pos); nDIR=newDir(B-A, recP-s[pos]); A=recP; B=A+nDIR; } } return 0; } |
SGU 108 – “Fake Prime Generator”
/* A very very very good problem * WA & MLE at least 10 times...WTF... * Need rolling array to reduce memeory to 4MB * Need pre-calc digit sum to reduce time * Cannot store whole a[MAXN] for 1..10^7 since memory is not enough * Checking while calculating and dupliated data should be handled * A problem similar to compute prime. */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; bool is[65]={0}; int digitSum[10000]={0}; int maxn, m; int r[5005],id[5005],ans[5005]; bool cmp(const int& i,const int& j) { return r[i]<r[j]; } int main() { int i; //Compute digitSum of 0-9999 for(i=0;i<10000;i++) digitSum[i]=digitSum[i/10]+i%10; while(scanf("%d %d",&maxn,&m)!=EOF) { memset(is,0,sizeof(is)); for(i=0;i<m;i++) { scanf("%d",&r[i]); id[i]=i; } sort(id,id+m,cmp); int pos=0,n=0,pr=0,tmp; for(i=1;i<=maxn;i++) { if(!is[pos]) { ++n; while(pr<m && r[id[pr]]==n) ans[id[pr++]]=i; // Same for multiple, WA: missing pr<m !!! } is[pos]=false; tmp=digitSum[i%10000]+digitSum[i/10000]; if(tmp+i<=maxn) { is[(pos+tmp)%64]=true; } pos=(pos+1)%64; } printf("%d\n",n); //Forget to output!!! WTF for(int i=0;i<m;i++) { if(i) printf(" "); printf("%d",ans[i]); } printf("\n"); } return 0; } |
SGU 107 – Numerical Tricky Problem
/* N*N%100000000 = 987654321 * (N%1000000000)*(N%1000000000) = 987654321 * First compute all the N < 1000000000, get 8 in total * Then it's simple... * 111111111 * 119357639 * 380642361 * 388888889 * 611111111 * 619357639 * 880642361 * 888888889 */ #include<cstdio> typedef __int64 LL; int main() { /* Generater for(LL i=0;i<1000000000;i++) { if(i*i%1000000000 == 987654321) printf("%I64d\n",i); } */ int n; while(scanf("%d",&n)!=EOF) { if(n<9) printf("0\n"); else if(n==9) printf("8\n"); else{ printf("72"); n=n-10; for(int i=0;i<n;i++) printf("0"); printf("\n"); } } return 0; } |
SGU 106 – extend GCD & Linear Congruence Equation
/* Extend GCD and Linear congruence equation with 2 unkonwns. * ax + by = c, has solutions iff c | gcd(a,b) * use eGCD to get ax' + by' = gcd(a,b) * x0=x'*c/gcd(a,b) * y0=y'*c/gcd(a,b) * solution is : x = x0 + b/gcd(a,b) * t * y = y0 - a/gcd(a,b) * t * for any int t */ #include<cstdio> #include<cstring> #include<cmath> typedef __int64 LL; LL egcd(LL a, LL b, LL &x, LL &y) { if(b==0) { x=1; y=0; return a; } else { LL ans = egcd(b,a%b,x,y); LL tx=x,ty=y; x=ty; y=tx-(a/b)*ty; return ans; } } LL abs(LL x) { return x>0?x:-x; } LL sign(LL x) { if(x>0) return 1; else if(x<0) return -1; return 0; } LL max(LL a, LL b) { return a>b?a:b; } LL min(LL a, LL b) { return a<b?a:b; } int main() { LL a,b,c,x1,x2,y1,y2; LL xL,xR,yL,yR,dx,dy,g,x0,y0; LL tl,tr,pl,pr,inc; while(scanf("%I64d %I64d %I64d %I64d %I64d %I64d %I64d",&a,&b,&c,&x1,&x2,&y1,&y2)!=EOF) { if(a==0&&b==0) { if(c) printf("0\n"); else printf("%I64d\n",(x2-x1+1)*(y2-y1+1)); } else if(a==0&&b!=0) { if(c%b) printf("0\n"); else if(c!=0) printf("%I64d\n",(x2-x1+1)); else printf("%d\n",((x1<=0)&&(x2>=0))?1:0); } else if(a!=0&&b==0) { if(c%a) printf("0\n"); else if(c!=0) printf("%I64d\n",(y2-y1+1)); else printf("%d\n",((y1<=0)&&(y2>=0))?1:0); } else { g=egcd(a,b,x0,y0); inc=-sign(a)*sign(b); if(-c%g) printf("0\n"); else { x0*=(-c/g); y0*=(-c/g); //printf("%I64d*%I64d + %I64d*%I64d = %I64d\n",a,x0,b,y0,-c); dx=b/g; dy=-a/g; if((x1-x0)%dx) { double tt=(x1-x0)/((double) dx); LL ttl=(LL)floor(tt); if(x0+dx*ttl>=x1) tl=ttl; LL ttr=(LL)ceil(tt); if(x0+dx*ttr>=x1) tl=ttr; } else { tl=(x1-x0)/dx; } if((x2-x0)%dx) { double tt=(x2-x0)/((double) dx); LL ttl=(LL)floor(tt); if(x0+dx*ttl<=x2) tr=ttl; LL ttr=(LL)ceil(tt); if(x0+dx*ttr<=x2) tr=ttr; } else tr=(x2-x0)/dx; if((y1-y0)%dy) { double tt=(y1-y0)/((double) dy); LL ttl=(LL)floor(tt); if(y0+dy*ttl>=y1) pl=ttl; LL ttr=(LL)ceil(tt); if(y0+dy*ttr>=y1) pl=ttr; } else { pl=(y1-y0)/dy; } if((y2-y0)%dy) { double tt=(y2-y0)/((double) dy); LL ttl=(LL)floor(tt); if(y0+dy*ttl<=y2) pr=ttl; LL ttr=(LL)ceil(tt); if(y0+dy*ttr<=y2) pr=ttr; } else pr=(y2-y0)/dy; if(inc>0) { if(y1>y0+tl*dy) { tl=pl; } if(y2<y0+tr*dy) { tr=pr; } } else { if(y1>y0+tr*dy) { tr=pl; } if(y2<y0+tl*dy) { tl=pr; } } //printf("%I64d %I64d\n",dx,dy); //printf("%I64d %I64d %I64d %I64d\n",tl,tr,pl,pr); printf("%I64d\n",max(tr,tl)-min(tr,tl)+1); } } } return 0; } |
Week 3,Life never changes
好吧,我承认我又忘记来这里了。又是新的一周开始了,我才想起来。
上周其实就两件事情,正如我今天开组会汇报的一样,一个是做UI Automation,说白了就是用C#去控制MFC,蛋疼了一点,然后是为了自动点击一些对话框,每天早上开机启动的时候要点很多,唉~不过这个工作跟上周Client Setting那个一样,估计到最后也不会用的,只是我没事情做,先开始做着呗,写点好的api造福后人吧。
另外一件就是HummingBird的database migration了,由于table schema改了,column name和type也都改了,所以先用excel造了一个庞大的对照表,不得不说新的DB无论从schema还是从column name来说,都比老的专业不少,显然pete和kevin是专业的。好吧。庞大的对照表建好之后开始用pete的新library写migration programme,进展还算顺利的,嗯,今天早上交差,其实周五下班就交差了。然后没什么大问题,嗯嗯,很好。
上周开始每周都有Lunch & Learning Event,嗯,还跟SG那里进行video conference,真正的video conference啊,才发现去年夏天我们做的东西多么小儿科,镜头就不是广角的,分辨率也好低,屏幕也小……不过每周有一天的lunch就必然是三明治了,不过不是普通的餐旦治,很正宗的西式三明治,培根,西冷牛排,啧啧,还是不错的,不过就是凉的,呜……
好吧,周五一早很蛋疼的8点就到,因为有个什么diversity breakfast,就是叫几个人来跟你坐一起吃三明治,有一搭没一搭的说几句。灰常的木有意思……不过会上碰到banking的一聊,才发现tech还是很幸福的,banking的人每天都是11点(PM)下班,有时候2/3点都有,5点通顶的都有,唉……真是……我宁可少拿点钱吧……这简直就不是人过的日子,还有什么生活质量可言啊。
嗯,周五去看了布拉德皮特的《生命之树》,果然情节慢啊慢,风景不错的,特效做的也不错,就是人物出场的时间少了点,说的话也拖老长,为的就是少说两句吧……唉……传教片,表示木有看懂。
哦对了,最近training很不来势,被自己鄙视了…更努力…
Week2 – Wing Lee St.
啊,一个小长假就忘记来这里了。今天补上,趁记忆还不是很模糊……
实习进入第二周,各种权限设定也都告一段落了,只是被visual studio的安装搞的很头大,RTM版的VS2008装不了SQL2008的Management Tool。可我不要SQL Server就要这个Tool,实在是悲催的最后装回2005。好吧,这周五是公众假期,所以只上4天班。
周一开始例行周会了,不过会上倒没我什么事情,就是坐那听听这周有什么news,工作有什么计划,反正价值高的活混不到我来做,Kevin和Pete两个专业写手很强大,我打打杂老老实实做support吧。这周的主要工作是找HummingBird的UI里的一些Bug,这个东西还是很早以前写的了,做了一周的Code Review,结果发现这个写的实在是不怎么Elegant,唉……开始艰难的Debug。
不过这周就这么一个活,还是很轻松,我实在想不通是哪个傻X会每次Load所有的Data,再每次重新逐条Update进数据库,check一下会死的啊。然后一本正经写了一个O(N^3)的check,结果无论如何都是return true的,搞毛。于是Save一下Data需要10秒,一共就1000条数据……真是佩服的五体投地。好在这个UI就这两个月凑合用用,等Kevin那边re-engineering完就totally报废。不的不感叹我干的活真是木有长远价值……
其实到周三我已经基本上把能改的都改了,我知道周四我们team一半人修年假,所以周四我就做了一天ACM题,呵呵,有点说不过去哈,题目是joe给我出的,7月16日local赛。首次跟阿joe合作。周四晚上做长春07的题目,被集体虐杀,只靠chin爷华丽的做了一道,然后剩下两道一题错在我,一题TLE。后来又轻松过了一道最短路,实在是非常坑爹。
有空写题解。Mark住先。
周末背着单反去了趟上环,去找那传说中的永利街,拍岁月神偷的地方。上环比起中环,保留了一些旧时代的气息,我基本上从山脚下爬上了半山的豪宅区,结果找不着路返回一路走到了西营盘。于是萌生了买张地图踏遍香港的想法,然后走过的路就在地图上标记起来,看看自己有多少能耐。后来洗澡的时候突发奇想想把这个做成一个app,依旧Mark住先,有空再来想。永利街在最后我将要放弃的时候找到了,比我想像中的还要破败,还在翻修,要不是回去一对比,我还真认不出来了。不过暴走3个小时,还喝到了曾特首最爱喝的竹蔗水,还是有点小满足的。
周日一口气看了三部速度与激情,虽然情节滥俗,但是车技还是很不错的,N2O让我想起了跑跑卡丁车,真是岁月不饶人啊。想起那时候买张点卡都是横凑竖凑,这么七八年过去了,什么都涨,唯一不涨的还就是那几张点卡…
有时候,一个人走在街头的感觉,也很不错。
(不知道为什么,照片就是传不上来……)
Week 1 – Nice start
其实,本来打算一天写一篇的,一开始两天忙了一下,后面两天懒了一下,一看周五了,好吧,我改写周记。
合同上本来写的是9点到6点是工作时间,鉴于我们team的情况比较特殊,于是我被要求8点半就到去开系统。好吧,其实这没什么,因为我老板的老板坐我旁边(实在感叹香港地方真是小,换在国内早就独立办公室了),每天早上7点半就到,把我狠狠的震惊了。之前培训的时候听neil说英国人是工作狂人,也没想到是这个样子。之后我养成了去那吃早饭的习惯,于是8点出头就到了,就问他为什么到的这么早。他只是淡淡的说,要和伦敦同步。
拜一个,当初就是他第一个面试的我,然后一个劲的对我说nice start,因为我是那天interview的第一个人。后来我们在闲扯的时候说,当初面试的时候他就想把我直接留下来开始干活算了,受宠若惊。
好吧,之前扯了这么多,从头说起吧。我在的team – auto pricing,属于equity derivative下面的,RBS在IT上的架构还是很宏伟的,人也很多,各种team,各种department。我的team里遇到了当年面试我的Jung,韩国人,当初聊的很欢,我的buddy和manager就不多说了,嗯,这个team里本地人比较多,所以我跟kevin说广东话,跟yip说英语,虽然yip跟别人都说广东话。
第一天其实还是intern们一起听各种IT部介绍,然后领自己的job description。大概下午5点回到自己的座位吧,然后大概看了一个环境,3显示器2电脑,因为RBS收了ABN,所以一台是RBS的一台是ABN的,嗯,办公用品齐全,电话很高级,跟电脑都连着的。然后座位还是很宽敞的,嗯,就是这样~不过不得不惊叹RBS的条件,茶水间要啥有啥,可乐雪碧苹果汁柠檬茶,各种饼干水果,各种咖啡茶包,相比于lyf美林的自动售货机,好的不是那么一点点……
OK第一天就这么愉快的结束了,kevin跟我说基本上都是6点半撤的,好吧,6点半就6点半,木有关系。第二天开始8点半到,因为我负责的auto pricing系统叫HummingBird,每天8点半要开始启动,嗯,然后就要去观摩学习自己操作。悲催的是我把7点闹铃按掉了,结果王左的铃声拯救了我,醒来7点半……即刻奔下去,进办公室8点31……以为死定了,幸好人不多……这一天就在搞各种request,request权限,安装文件,系统设置,blablabla……又一天结束了……
好了第三天开始就我负责每天开系统了,每天kevin会坐我旁边然后看我开,并给我介绍介绍,我有时的确很惊讶投行的系统……居然跟我说用excel来做的,然后excel这个东西不稳定,容易crash……所以他们正在全部转成.NET。早干什么去了,那个excel看的我纠结啊……各种bug,各种runtime error,各种resource unavailable……算了,我充其量也是路过打多几次酱油……不作评论。
事情在第四天开始真正有点事情做了,kevin告诉我要写一个utility,用来给一个monitoring system做插件,嗯,好的,其实就是连连数据库,写写log file,不过用c#写,外加一点外部class比如log4net,好吧,这才是我该做的事情嘛~于是乎,我花了两天时间,就搞定了,等我第二天上午跟kevin说我写完了,他表示压力很大……
之后的空闲时间,多半是在浏览rbs内各种网页,各种系统,各种申请,然后周五下午打算做SGU,发现提交是global error,之前听过有人上传code被解雇了,我怀疑会不会有问题……事实证明是sgu SB,好吧,下周开始如果木有事情我就做题去了……
周五yip跟我聊了一个多小时,说说公司业务情况,IT部人进来的发展线路,无外乎两条线,一面向PM进发,一面是Senior Developer,就我观察,PM的工作比SD工作轻松,毕竟都是动动嘴皮子,写写proposal,然后具体就交给Dev了。唉,每天PM走的都比SD早,情何以堪啊。
好吧,下周开始,估计该有点事情做做了吧。
————————————————————我是谁你知道—————————————————————
《A BEST》,每天在地铁里穿梭的2个小时,就是这张专辑陪我度过的,相比摇滚轻快的风格,我还是比较喜欢沉重一点带点忧郁的味道,AYU的这张不愧是日本唱片史上销量第6大的专辑。《End Roll》,之前一直没发现这首歌,只是前天晚上望着穿梭的地铁,耳畔想起的这首歌,让我一下子觉得很有感觉。正好是高考放榜的日子,三年了,青春能有几个三年?
有时候怀念只是一刹那,却留下无尽的感伤。
好吧,我知道我很久没来了。
RT。几乎荒废了这个blog,再次下决心要收拾一番,不知道这次又能坚持多久。
如果要从上次写blog算的话,差不多快1个学年没来过了。追溯一个学年前的往事,一样样说的话估计我也没这个时间没这个能力说完。估计写到哪是哪吧。
迈入final复习期,其实事情还是一堆一堆的,443还有两份作业,414还有个pro,精研组又冷不丁的杀出来个report和present,还有三个final,真是搞的头很大,几乎无从下手。两天复习差不多复习了443的一半和326的1/5,效率不算高,不过阿mole的notes永远需要配上录音才能明白,外加peter大神在录音里的贱笑实在让我理解起来有点困难。不过不得不说比起听315的录音,我的广东话的水平还是提高了不少的。
毕竟,三年了都。
好吧,让复习先一边去吧,说好final不玩魔力的,昨天还是上了那么一个晚上,的确发现自己开始无聊了,不知道顾拜蛋当初是怎么帮我练猎人的,猎人上不去厨师跟着赚不到钱。弓手45级依旧很瓶颈,就跟当初一样,7年前也是一样的,我有预感我又会在50+二转之后就放弃。曾经的阿堵物。
有时候时间的确是个杀千刀,冷不防出来偷袭一下。当我这次开始玩魔力跟人说自己是老玩家的时候,掰掰手指,1,2,3……我以为一只手已经够数的了,却发现需要两只了。8年了,刚玩那会刚上初中,现在还有一年大学就快毕业了,周围的玩伴越来越少,各自奔天涯的确木有任何问题,离家越来越远,但是想起当初第一次玩的时候还是拨号上网,一个月回来老爹就换成宽带了,心里还是很感慨。
很久不听飞儿的歌,蓦地想起当年在寝室里哼唧,还有球场上广播里的无限,还有大清早偷偷的跑到教室听MP3……
华年似水。