一个错误

来源:互联网 发布:苹果大麦网抢票软件 编辑:程序博客网 时间:2024/05/29 03:05

今天我做了一道比较简单的题目,jzoj5340,思路也是比较简单,然后我也很快的码完了程序,但交到oj上却只有90分,然后我就不停的调试,不停的将程序分段检查,检查各自的子程序是否与预期相同,但是我唯独没有去看快速幂,因为我觉得这是已经写到烂的东西,于是我一直检查直到八点零八分,我带着绝望随手看了看快速幂,我就想有没有可能是溢出了呢?我就改了一下,居然就对了。九十分的代码和100分的代码就差一点。
九十分快速幂:

function power(a,b,n:int64):int64;var        t,y:int64;begin        t:=1;        y:=a;        while b<>0 do        begin                if(b and 1)=1 then                t:=t*y mod n;                y:=y*y mod n;                b:=b shr 1;        end;        exit(t);end;

100分快速幂:

function power(a,b,n:int64):int64;var        t,y:int64;begin        t:=1;        y:=a;        while b<>0 do        begin                if(b and 1)=1 then                t:=t mod n*y mod n;//就是这里                y:=y mod n*y mod n;//这里也是                b:=b shr 1;        end;        exit(t);end;

就是因为90分的代码没有先分别模了之后再乘,而是先乘了之后再模,在平时写代码中,也经常要写模,但是又不能处处都模,因为模的速度非常慢,但是如果没模好,那就悲哀了。总之,接下来少犯这种错误吧,吃一堑,长一智。

诡异

当我改了很久终于对了这道题目,并且现在速度和空间第一的情况下,我看了一下别人的代码,发现c++的可以不像我的100分代码那样写,直接写我90分代码那样的就行了。唉,反正,用pascal的选手小心点吧。

原创粉丝点击