开始慢慢感受到数学对oi的作用了,倒回去仔细看了看入门经典的数学基础那块,介于本人实在健忘在此写下读书笔记。
1.cantor的数表:
一道很常见的题,有两种解题方法:
<1>.前i条斜线一共有 s(k)=1+2+3+4+5+.....k 个数。
用一个简单的for循环到s>=n,分子就为k-s+n,显然分母加上分子的和是第k列+1,所以分子就为k+1-(k-s+n),整理之。//这里入门经典有错
(小提一下自己的证明思路,大概是:如n=7;则此时s=10;k=4;
本人理解的时候,看成是7=6+1,10=6+4,10-7<=>4-1,根据分子和分母的关系可知,这里求出来的就为分母,其他同上)
顺带附上代码:
1 #include<cstdio> 2 using namespace std; 3 int main() 4 { 5 int n,k,i,s; 6 7 while(scanf("%d",&n)==1) 8 { 9 k=1;s=0; 10 for(;;) 11 { 12 s+=k; 13 if (s>=n) 14 { 15 printf("%d/%d\n",k-s+n,s-n+1);//这里书有错,注意改正。若不信,可自己动手试试 16 break; 17 } 18 k++; 19 } 20 } 21 22 return 0; 23 }
<2>.第二种数学味道会浓一些。
s(k)=1+2+3+4+5+....k=1/2k(k+1)
n<=s(k)<=1/2k(k+1)
<=> k2+k-2n
<=>
这样我们就可以不用for循环,直接把k预处理掉,输出结果就ok啦。。
但是要注意下浮点数要使动成整型。