|
公告
日历
| | 日 | 一 | 二 | 三 | 四 | 五 | 六 |
|---|
| 29 | 30 | 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 | 1 | 2 | | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|
统计
- 随笔 - 71
- 文章 - 0
- 评论 - 201
- 引用 - 0
导航
常用链接
留言簿(17)
我参与的团队
随笔分类
随笔档案
相册
blog
links
宠物
搜索
积分与排名
最新评论

阅读排行榜
评论排行榜
|
2008年2月13日
摘要: 翻到以前写的一个程序。贴出来优先推理,无法确定的情况下找分支最少的一个去猜,并把当前状态保存,以备将来回溯。#include<cstdio>#include<cstring>#include<cassert>#include<vector>#include<algorithm>usingnamespacestd;structNode{ch... 阅读全文
2008年2月12日
天龙八部中,姑苏慕容家婢女阿朱本是大理镇南王段正淳和阮星竹所生的两个女儿之一。她与乔峰历经坎坷之后情投意合,本打算在乔峰报了血海深仇之后一同放牛牧马过平谈快乐的生活。谁知道机缘巧合,居然让阿朱为了救自己生父段正淳而不得与亲人相认,甚至还要替父而死。 阿朱重情重义,甘愿舍身为乔峰而死。实在让我很感动。爱一个人可以爱到这样的地步。唉,只能叹息造物弄人,让有情人不能团聚,让骨肉分离。 因为段王爷的那无关生死的花心大萝卜行为经过一连串的事件放大之后可以造成无数的惨案和悲剧。蝴蝶效应应该是金大侠发现的才对~跑题了。 只能说阿朱太好了。好到太为乔峰着想了。假如有一些话能挑明,能再说得清楚一些。应该就不会有这样不幸的结局了。一连串事情实在太巧了,巧得让人觉得假...真希望阿朱没有死。 阿朱,走好~
2007年7月19日
一个只包含EOF三个字符的字符串,并且不存在连续的O,问长度为n的这种串有多少种。 其中0<n<40。 递推: e'=e+o+f, o' =e+f, f'=e+o+f
// 预处理查表 main(i,n){__int64 d[39]={1,1,1,3};for(;i<39;i++)d[i][1]=d[i-1][0]+d[i-1][2],d[i][2]=d[i][0]=d[i][1]+d[i-1][1],d[i][3]=d[i][1]+d[i][0]*2;while(~scanf("%d",&n))printf("%I64d\n",d[n][3]);} // 把eof分开存,去掉二级数组的括号 main(i,n){__int64 e[39]={1},o[39]={1},f[39]={1},s[39]={3};for(;i<39;i++)f[i]=e[i]=(o[i]=e[i-1]+f[i-1])+o[i-1],s[i]=o[i]+e[i]*2;while(~scanf("%d",&n))printf("%I64d\n",s[n-1]);} // e,f总是一样的,于是去掉f main(i,n){__int64 e[39]={1},o[39]={1},s[39]={3};for(;i<39;i++)e[i]=(o[i]=e[i-1]*2)+o[i-1],s[i]=o[i]+e[i]*2;while(~scanf("%d",&n))printf("%I64d\n",s[n-1]);} // 与其保存总和,不如结果时计算一下 main(i,n){__int64 e[39]={1},o[39]={1};for(;i<39;i++)e[i]=(o[i]=e[i-1]*2)+o[i-1];while(~scanf("%d",&n))printf("%I64d\n",o[n-1]+e[n-1]*2);} // 不再查表,按需计算 main(i,n){__int64 e,o,t;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(i=e=o=1;i<n;i++)t=o,e=(o=e+e)+t;} // 调整一下递推式 main(n){__int64 e,o,t;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(e=o=1;--n;e=(o=e+e)+t)t=o;} // 再调整递推式,去掉临时变量 main(n){__int64 e,o;for(;~scanf("%d",&n);printf("%I64d\n",o+e+e))for(e=o=1;--n;o=e-o)e+=e+o;} // 多一次循环,结果就是e main(n){__int64 e,o;for(;~scanf("%d",&n);printf("%I64d\n",e))for(e=o=1;n--;o=e-o)e+=e+o;}  农夫三拳,这下你还能更短吗。嘿嘿嘿:)
2007年7月18日
给定一个日期,输出这个日期是该年的第几天。输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成。对于每组输入数据,输出一行,表示该日期是该年的第几天。
比如 1985/1/20 2006/3/12 输出 20 71
main(y,m,d){while(scanf("%d/%d/%d",&y,&m,&d)==3){char s[]={0,1,-1,0,0,1,1,2,3,3,4,4};m--;d+=m*30+s[m],(y%400==0||y%100&&y%4==0)&&m>1&&d++;printf("%d\n",d);}}
int s[]={0,1,-1,0,0,1,1,2,3,3,4,4};main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+s[m]+!((y%400&&0==y%100||y%4)||m<2)))m--;}
int s[]={0,1,-1,0,0,1,1,2,3,3,4,4};main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+s[m]+!(y%400&&0==y%100||y%4||m<2)))m--;}
int s[]={0,1,-1,0,0,1,1,2,3,3,4,4};main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+s[m]+!(y/100%4||y%4||m<2)))m--;}
int s[]={0,1,-1,0,0,1,1,2,3,3,4,4};main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+s[m]+!(y/100%4+y%4||m<2)))m--;}
main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+"bcabbccdeeff"[m]-'b'+!(y/100%4+y%4||m<2)))m--;}
main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+"BCABBCCDEEFF"[m-1]-96+!(y/100%4+y%4||m<3)));}
main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+"XBCABBCCDEEFF"[m]-96+!(y/100%4+y%4||m<3)));}
main(y,m,d){for(;~scanf("%d/%d/%d",&y,&m,&d);printf("%d\n",d+m*30+"XBCABBCCDEEFF"[m]-95-(y/100%4+y%4||m<3)));} 不多解释了... 也许这里只有y/100%4+y%4判断是否是闰年有点价值吧...
2007年7月14日
问题: 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
对于每组输入数据,输出一行,结果保留两位小数。 比如,输入:
那么输出:
题目很简单,甚至有点无聊了。
#include <math.h> int main() { float a,b,c,d; while(scanf("%f%f%f%f",&a,&b,&c,&d)==4) { printf("%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b-d))); } return 0; } 好吧,第一个看上去已经挺短的了。好吧,换编译器,用c的编译器,gcc,vc也可以(存.c文件)。这样可以利用一些c的'好处',至少对缩短代码来说是好处。
#include <math.h> main() { float a,b,c,d; while(scanf("%f%f%f%f",&a,&b,&c,&d)==4) printf("%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b-d))); } 默认函数返回类型为int,返回值?我管它是多少呢,短就行了。去掉不必要的空白。
#include<math.h> main(){float a,b,c,d;while(scanf("%f%f%f%f",&a,&b,&c,&d)==4)printf("%.2f\n",sqrt((a-c)*(a-c)+(b-d)*(b-d)));} 125 可惜,怎么还得留着math.h,否则sqrt未定义的情况c语言认为它是一个返回int的函数,于是链接时没能链接到我们想要的函数。 继续缩短,那段差的平方很扎眼,那么多括号。scanf的返回值比3大和等于4也差不多了,总不至于要求4个输入,却得到5个吧。也改了
#include<math.h> main(){float a,b,c,d;while(scanf("%f%f%f%f",&a,&b,&c,&d)>3)a-=c,b-=d,printf("%.2f\n",sqrt(a*a+b*b));} 118 while和for的长度其实是一样的,虽然for比while少2个字母,但for语句要多2个分号。算是打平,不过其实不然。注意当循环体有多句的时候,把最后一句放到for的末尾,还可以节约一个逗号- -
#include<math.h> main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;} 117 那个包含文件真讨厌,而且非得换行。要是能去掉它就好了。既然我只是为了要sqrt,为什么不自己声明一下呢。
double sqrt();main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;} 114 嗯,看来确实短了一些。double和float能通用吗?也许不能吧,要不试试?
float sqrt();main(){float a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;} 113 居然可以,输出结果正确。奇怪啊...反编译一下。哦。原来作为参数,float也被转为double类型压栈。这个可能不太保险,天知道是不是所有机器都压double呢- -。不过好在这里能凑合,那x86的估计也都能。 啊呀,我傻啊,为什么有2个float在代码里!怎么不把它们合并了?
main(){float sqrt(),a,b,c,d;for(;scanf("%f%f%f%f",&a,&b,&c,&d)>3;printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;} 107 农夫三拳想出了一个方法,他提示到“-1的二进制”。哦!对了,当scanf遇到输入结束时返回EOF,那就是-1。-1的二进制为全1,也就是说反码为0。好吧,感谢农夫三拳让我再缩短一个字节,让>3见鬼去吧~
main(){float sqrt(),a,b,c,d;for(;~scanf("%f%f%f%f",&a,&b,&c,&d);printf("%.2f\n",sqrt(a*a+b*b)))a-=c,b-=d;} 106 结束... 如果您有更bt的想法能缩短代码,请别忘了告诉我~
2007年5月8日
我的结果: Psytopic分析:您的性格类型是“ ISTP”(内向+实感+思维+知觉) 容忍,有弹性;是冷静的观察者,但当有问题出现,便迅速行动,找出可行的解决方法。能够分析哪些东西可以使事情进行顺利,又能够从大量资料中,找出实际问题的重心。很重视事件的前因后果,能够以理性的原则把事实组织起来,重视效率。 ISTP型的人坦率、诚实、讲求实效,他们喜欢行动而非漫谈。他们很谦逊,对于完成工作的方法有很好的理解力。 ISTP型的人擅长分析,所以他们对客观含蓄的原则很有兴趣。他们对于技巧性的事物有天生的理解力,通常精于使用工具和进行手工劳动。他们往往做出有条理而保密的决定。他们仅仅是按照自己所看到的、有条理而直接地陈述事实。 ISTP型的人好奇心强,而且善于观察,只有理性、可靠的事实才能使他们信服。他们重视事实,简直就是有关他们知之甚深的知识的宝库。他们是现实主义者,所以能够很好地利用可获得的资源,同时他们擅于把握时机,这使他们变得很讲求实效。ISTP型的人平和而寡言,往往显得冷酷而清高,而且容易害羞,除了是与好朋友在一起时。他们平等、公正。他们往往受冲动的驱使,对于即刻的挑战和问题具有相当的适应性和反应能力。因为他们喜欢行动和兴奋的事情,所以他们乐于户外活动和运动。 您适合的领域有:技术领域 证券、金融业、贸易、商业领域 户外、运动、艺术等 您适合的职业有: · 信息服务业经理 · 计算机程序员 · 警官 · 软件开发员 · 律师助理 · 消防员 · 私人侦探 · 药剂师 · 证券分析员 · 银行职员 · 管理顾问 · 财务顾问 · 电子专业人士 · 技术培训人员 · 信息服务开发人员 · 软件开发商 · 海洋生物学者 · 后勤与供应经理 · 经济学者 · 贸易商 · 商品经销商 · 产品代理商(有形产品) · 警察 · 侦探 · 体育工作者 · 赛车手 · 飞行员 · 雕塑家 · 手工制作 · 画家
2007年4月4日
使用Sketchup作为nebula2的场景编辑器 --kaikai
极短的简介 ========== Sketchup作为一个快速建模软件,有着易学易用、简洁高效的特点。十分适合美术以及关卡设计师使用。
组件 Component ============== 要编辑场景,必须把各个需要用到的模型转为组件,然后在把组建拖放到场景内摆放组合。组件区别于实际用于游戏中的组件模型,它可以是组件模型的简化甚至可以是象征。 概念 组件定义Component Definition 组件的内容 组件实例Component Instance 组件在场景的引用,包含位置、方向、缩放、别名等信息 规则 1 组件要导出必须有文件名(注意此条规则可以去除,保留它仅仅了导出后可以导入) 2 组件实例可以自定义组件名:右键点击组件实例,选择Entity Info,在弹出的Entity Info窗口内Name字段填写。 自定义组件名用于程序识别组件的逻辑意义。比如同样的多个交通灯组件实例,可以分别定义组件名为:TrafficLightA, TrafficLightB, TrafficLightC等。
额外的配置文件 ============== 为了赋予组件更多的功能,需要提供更多的信息来区分组件的性质。使用一个额外的配置文件来保存这些信息 概念 唯一名称 Unique name 组件定义的文件名,如 box.skp 自定义组件名 Name 标志组件逻辑的名字,参见 组件-规则-2 输出路径 path 相对路径,按组件类型不同对应不同的根路径 摆放类型 Transform 由平移(Position)、旋转(Rotation)、缩放/拉伸(Scale)的缩写PRS组成,如P,R,S,PR,PS,RS,PRS 类型 区分组件使用方法的名字,分为Graphics,Triggers,Collision,NamedPos等 Graphics 场景元素,组件是任意网格模型,可以被平移、旋转、缩放/拉伸(PRS)。 Triggers 触发器,组件是单位立方体,可以平移、旋转、缩放/拉伸(PRS)。 Collision 场景物理碰撞模型,组件是任意网格模型,可以平移、旋转(PR)但不能缩放/拉伸(S)。(ode不支持geom的缩放/拉伸) 也可以是单位立方体/单位球/单位胶囊体(单位圆柱体两侧连2个单位半球体),可以平移、旋转、缩放/拉伸。(通过ode的内置几何体参数实现缩放/拉伸)球体只能缩放,不能拉伸;胶囊体只能缩放不能拉伸,但可以把圆柱体部分拉伸。 NamedPos 出生点SpawnPos, 目标点ExitPos等等逻辑坐标。可以平移、旋转(PR)。 规则 1 Graphics组件的配置文件信息包含:unique name, name, path, transform, type。其中type为区分
导出流程 ======== 1 带有组件的skp -(使用本项目附带的sketchup插件导出)-> map文件 2 map文件 + xml配置文件 -(map2xml转换)-> 场景xml文件 3 场景xml文件 -(nsketchupmaploader读取)-> mangalore场景
2007年2月26日
例如:6的因数有1,2,3,6,它们的和是12 下面求n^m的所有因数之和除以一个数s的余数.
#include <cassert>
#include <vector>
using namespace std;

static vector<int> primes;
bool IsPrime(int n)
  {
for(size_t i = 0; primes[i] * primes[i] <= n; i++)
 {
if (n % primes[i] == 0)
return false;
}
return true;
}

int GetPrime(size_t index)
  {
assert(index < 10000);
if (index >= primes.size())
 {
if (primes.size() == 0)
 {
primes.reserve(10000);
primes.push_back(2);
primes.push_back(3);
primes.push_back(5);
primes.push_back(7);
}
for (int t = primes.back() + 2; index >= primes.size(); t += 2)
 {
if (IsPrime(t))
primes.push_back(t);
}
}
return primes[index];
}

__int64 PowerMod(__int64 n, __int64 m, __int64 s)
  {
__int64 t;
for(t = 1; m; m >>= 1)
 {
if (m & 1)
t = t * n % s;
n = n * n % s;
}
return t;
}

int SumFactorMod(int n, int m, int s)
  {
int t;
int sum = 1;
for(t = 0; n > 1; t++)
 {
int p = GetPrime(t);
int q = 0;
while(n % p == 0)
n /= p, q++;
if (q)
 {
 /**//*
若 n = PI{pi^qi} pi为质数,则sum可以表示为 PI{ f(pi, qi) }
其中的f(p, q) = p^0 + p^1 + P^2 + p^q = (p^(q+1) - 1) / (p-1)
于是,要求的值sum % s = PI{ f(pi, qi) % s } % s
其中f(p, q) % s = (p^(q+1) - 1) / (p-1) % s
由x/y%z = x%(y*z)/y得到
f(p, q) % s = (p^(q+1) - 1) % (s * (p-1)) / (p-1)
= (p^(q+1) % (s*(p-1)) + (s*(p-1)-1)) % s*(p-1) / (p-1)
其中 p^(q+1) % (s*(p-1)) 可以用PowerMod快速求解得到
*/
q *= m;
__int64 sp_1 = __int64(s)*(p - 1);
__int64 t = PowerMod(p, q+1, sp_1);
t += sp_1 - 1;
sum *= t % sp_1 / (p - 1);
sum %= s;
}
}
return sum % s;
}

int SumFactorMod(int n, int s)
  {
return SumFactorMod(n, 1, s);
}补充:把注释补充了一下,有人对"若 n = PI{pi^qi} pi为质数,则sum可以表示为PI{ f(pi, qi) }"不理解。下面粗略推导一下: n = PI{pi^qi} pi为质数 则n的因数可以列为:a1, a2, ... a(PI{qi+1}) 按p0因数出现的次数排列如下: a1=1 aq0+1=p1 ... a(PI{qi+1}-q0+1) =p1^q1*p2^q2*...*p0^0 a2=p0 aq0+2=p1*p0 ... a(PI{qi+1}-q0+2) =p1^q1*p2^q2*...*p0^1 a3=p0^2 aq0+3=p1*p0^2 ... a(PI{qi+1}-q0+3) =p1^q1*p2^q2*...*p0^2 ... ... ... aq0=p0^q0 aq0+q0=p1*p0^q0 ... a(PI{qi+1}) =p1^q1*p2^q2*...*p0^q0 由乘法原理可知: 这些因数中有0个pi因子的因数有PI{qi+1}/(qi+1)个 有1个pi因子的因数也有PI{qi+1}/(qi+1)个 ... 有qi个pi因子的因数也有PI{qi+1}/(qi+1)个 这qi+1组PI{qi+1}/(qi+1)个数的集合,如果分别去除pi因子,则刚好是完全相同的集合。 这个集合就是n去除了因子pi后的数字 n / pi^qi 的因子集合。 于是有 g(n)=(pi^0+pi^1+...+pi^qi)*g(n / pi^qi) 也就是g(n)=PI{pi^0+pi^1+...+pi^qi}
2007年2月25日
|