悲惨的大学生活
午夜:自然饿晕
清晨:自然饿醒
。。。
谁说大学是天堂???
其实——
生前何必久睡;死后自会常眠。
嗯,RT,今天很不爽,所以我写的这篇文章也很幼稚。。。
为什么从小学以来老师们严格禁止除0呢?在C语言中,如果除的结果过大的话就会输出#1.INF等,但是每当除0的话就会报错Running Time Error,为什么我们不定义1/0 = ∞?
其实原因很简单,假设我们可以定义1/0 =∞, 那么2/0=∞,而2/0 = 2*1/0 = 2*∞ = ∞ + ∞ = ∞, 利用定义加法中的公理∞=0,这就导出了矛盾
怎么样,很幼稚吧,继续来:
什么叫加法?
在空间M中定义加法+是满足几条公理的运算法则,大概如下:
1 交换律:a+b=b+a
2 有结合律:(a+b)+c = a+(b+c)
3 有唯一单位元0:a+0 = 0+a = a
4 a有唯一逆元:a+(-a)=(-a)+a=0
消去律可以从这几条性质推出:a+b=a+d ==> b = (-a+a) + b = (-a)+(a+b) = (-a) + (a+d) = (-a+a)+d = d
M可以是任意的,比如我可以作如下M:
M={0,猫,狗,阿猫阿狗},定义+:0是单位元,猫+狗=阿猫阿狗,猫+阿猫阿狗=0,狗+狗=0,狗+阿猫阿狗=猫,猫+猫=狗,阿猫阿狗+阿猫阿狗=狗
怎么样,想到了什么?猫狗大战,很无聊吧,很幼稚吧,哈哈,改天写下高代。。。
昨天哈工程的网络预赛1004,数论题,关于具体推导可以看这里(牛人的数学证明):
http://hi.baidu.com/5l2%5F/blog/item/8c1e51dcb72511a7cd11662b.html
重点是Hint:
Hint:The number n never has a prime factor greater than 13000000, but n may be extremely large。
所以说具体实现要用到高精度除法,大概就是检查这个数可不可以被13000000以内的质数平方整除,问题就在这里,一般来说素数筛法是O(n)的,那么在哈工程的评测机上生成质数表就需要0.65秒,而后再用高精试除,但是这个素数表有84W+的质数,再加高精确实超时。
但事实上只要判断2-sqrt(13000000)之间的素数就可以了,为什么?因为他的题出错了,而且改了之后还错上加错,上面的Prime是后来加上去的,因为出题人发现了这道题的错误,测试数据里大概有诸如
2*3*5*7*…*101>>13000000的数据,他开始大概认为这个数据没有大于13000000的因子,因为他这样想:这个数的两两质因子的乘积都小于13000000,所以这是正确的,但后来有人在讨论版提问,他想了想,似乎不对呀。于是加上了prime,这样的话数据规模就不得了了,但是他应该也没有想过这个问题,所以没有再改数据范围,其实正确的Hint是:
Hint:The number n never has a prime factor greater than sqrt(13000000), but n may be extremely large。
OMG!我的AC啊,就这样没了,早知道当时我也应该怀着侥幸心理就能把这道题搞定了!另外我更希望现场赛不再有这种情况。
前几天北京高校编程赛,本来不想提了,但是为了让自己还记得这次非常丢人的表现,现回忆那天的经过。
开赛前我们观察气球的颜色,然后根据经验我们认为颜色越浅越奇怪的气球代表了越难的题,于是开赛我们就在看那些颜色比较正常的气球,结果没有发现水题。。。另外发现数学题奇多,最多的是组合数学,而且包含数学题的各种层次,数学题本来该我做,于是我就在看那道A Simple Problem,结果发现。。。那道题一点也不Simple,于是跟Deity说那道简单的递推我来做,结果。。。一小时没推出来(汗。。),又交给Deity,结果他一小时做完了。。。然后我看Matrix Game那道题,按我的想法先判每行0,1的个数,再列比对,但是有个问题就是如果有很多行0,1个数相等怎么办,想了一会觉得没有希望就放弃了(这道题托数据弱的福,最后eenh同学推了一个假定理,只比对了每行0,1的个数,过了。。。虽说是cheat,但是不管怎么说别人过了而我却没过。。。)此时我心情低落到极点,一行代码都写不错,就想着帮别人想算法,然后我看A,A的算法我已经知道了,就是判连通和找奇圈,但是我居然忘了奇圈怎么求,而且我们队没人知道!!!(这道题MS数据也极弱,只要宽搜卡50步都过,汗。。。早知道当时就让Deity写了),后来我看了B题(群论)C题(DP),B题是比较难,但是我在比赛后也想了出来,C题DP说实话不难,为什么没人做我也不知道,当时我把我的想法和eenh一说,但是用的是一种形象的语言,没有写出公式,于是他认为这不是可行算法,果断放弃,写线段树去了。。。过后看解题报告,果然和我方法一样,又漏了题,而后我开始专心的写A Simple Problem,我认为他是有周期性的,所以写了个递推,居然WA掉了,因为TLE...
Fibonacci数列之普及版:
Fibonacci数列源起一个我们现在看起来非常“幼稚”的问题:开始时有一对兔子,每对兔子每个月繁殖一对,假设兔子没有死亡,这样历经了n个月,兔子有了多少对呢?
很容易把这个问题用数学语言来表达出来:
设第n个月有F(n)只兔子,依题意有
F(0)=1, F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2)
看上去就是一个很简单的数列,又有什么玄机呢?
首先从直观的感觉上来说,似乎这个数列增长速度并不是很快,就是加法嘛,怎么加也就那样了,但是这种感觉是大错特错的!我们可以利用下面的程序运行一下:
#include <iostream>
#include <cmath>
using namespace std;
int F[50];
int main()
{
int i;
F[0]=F[1]=1;
for(i=2;;i++){
F[i] = F[i-1]+F[i-2];
if(F[i]
}
int cnt=i;
for(i=0;i<45;i++)
{
cout << F[i] << endl;
}
system(“pause”);;
}
最后一项是n=45时的情况,已经是10^9了,增长速度是惊人的!学过生物的人肯定知道有一个在没有生存压力的情况下种群“J”字形增长图,没错,就是这个模型。
于是大家就会思考了,那个图好像是指数型增长,难道说Fibonacci数列也是指数型增长的吗
我们来做一个实验,用Matlab一下,画出log(Fn)的图像
几乎是一条完美的直线,看来Fibonacci数列确实是呈指数形式增长的
虽然完美,但在左下角依然有一小小的显然不成线性的部分,这说明Fibonacci数列毕竟不是指数序列,而是一个混合体。
事实上,这个数列的通项公式是1/√5*(((1+√5)/2)^n-((1-√5)/2)^n),有人说,这是什么破公式,一点也不完美,但是仔细看就会发现(1+√5)/2是黄金分割比,而(√5-1)/2是它的倒数,为什么我们求出来的log函数...