SGU 111 – High Precision Square Root

/* 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");
}

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……

华年似水。