TOJ 3428. Fibonacci(Fibonacci数列的一个很好玩的规律)
2010-07-24 02:08
531 查看
题意大概是给一组数M,N,求出第M个末位有N个0的Fibonacci数列是第几项。
乍一看,吓我一跳,结果在2^31内,大的惊人。后来拿一个程序(正好是TOJ的一道题,求1000位内的Fibonacci数列)暴力了下,好家伙,有规律的。
第一个末位有1个0的是第15项,第二项第30…然后看末位有2个0的,第一个是150项,第二个第300项。然后很高兴了写了个程序,WA...
有点晕,又暴力了下,加大范围,发现第一个末位3个0的不是1500项,而是750项。无奈了,好奇怪。于是猜只有这一个特例,依然WA。最后请教了个学长,他说他也是猜的,不过后边的确实都是10倍了,就那一个特例。
接下来其实过程异常艰辛,不过最终将这个题拿下了。
--------------------------------------------------------我是低调的分割线-------------------------------------------------------------------------------------
大概是这样分布的:
15 30 45 ... 150 165 180 195 ... 300 ... 750 ... 1500 ... 7500
第1个0 第2个0 第3个0 第1个00 第10个0 第11个0 第12个0 第2个00 第1个000 第1个0000
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
所以可以看到,不能直接按间隔算,因为比如150.,它算2个0,而不是第10个1个0。
又不能枚举,一定会超时(确实超了)
所以可以先按照没有重叠算,然后加上重叠的,重叠的只算下一个就好,因为再后边的也就都包括了。
算重叠的部分要把特殊的2拿出来。倍数是5就是 4 1 4 1 4 1这样分布,10的话就是 9 1 9 1 9 1 9 1 9 1,所以按照这样算,
比如要求第14个末位有2个0的,14%4!=0 ,14/4=3,所以重叠了3次。又比如20, 20%4==0,20/4-1=4,重叠4次。
乍一看,吓我一跳,结果在2^31内,大的惊人。后来拿一个程序(正好是TOJ的一道题,求1000位内的Fibonacci数列)暴力了下,好家伙,有规律的。
第一个末位有1个0的是第15项,第二项第30…然后看末位有2个0的,第一个是150项,第二个第300项。然后很高兴了写了个程序,WA...
有点晕,又暴力了下,加大范围,发现第一个末位3个0的不是1500项,而是750项。无奈了,好奇怪。于是猜只有这一个特例,依然WA。最后请教了个学长,他说他也是猜的,不过后边的确实都是10倍了,就那一个特例。
接下来其实过程异常艰辛,不过最终将这个题拿下了。
--------------------------------------------------------我是低调的分割线-------------------------------------------------------------------------------------
大概是这样分布的:
15 30 45 ... 150 165 180 195 ... 300 ... 750 ... 1500 ... 7500
第1个0 第2个0 第3个0 第1个00 第10个0 第11个0 第12个0 第2个00 第1个000 第1个0000
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
所以可以看到,不能直接按间隔算,因为比如150.,它算2个0,而不是第10个1个0。
又不能枚举,一定会超时(确实超了)
所以可以先按照没有重叠算,然后加上重叠的,重叠的只算下一个就好,因为再后边的也就都包括了。
算重叠的部分要把特殊的2拿出来。倍数是5就是 4 1 4 1 4 1这样分布,10的话就是 9 1 9 1 9 1 9 1 9 1,所以按照这样算,
比如要求第14个末位有2个0的,14%4!=0 ,14/4=3,所以重叠了3次。又比如20, 20%4==0,20/4-1=4,重叠4次。
#include<stdio.h> int main(void) { int a[18]={0,15,150,750,7500,75000,750000,7500000,75000000,750000000}; //保存第一个连续1个0,2个0的第一个 int i,j,k,m,n,cas,key; scanf("%d",&cas); while(cas--){ scanf("%d%d",&n,&m); key=m*a ; if(n==2){ if(m%4!=0) key+=(m/4)*a ; else key+=(m/4-1)*a ; } else{ if(m%9!=0) key+=(m/9)*a ; else key+=(m/9-1)*a ; } printf("%d/n",key); } }
相关文章推荐
- 把一个List集合有规律的插入另一个List集合中
- GCD XOR UVA 12716 找规律 给定一个n,找多少对(a,b)满足1<=b<=a<=n,gcd(a,b)=a^b;
- (Relax 数论 1.18)POJ 3372 Candy Distribution(找规律,判断一个数看其是否是2的多少次幂)
- 兔子繁殖规律——Fibonacci数列
- C语言题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
- 动态获取规律的id:如5022001(一个优秀的程序员教会我的)
- 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
- 有一排好的数组,插入一个数,最大就放最后,否则按规律插入(不知道循环的道理)和出错
- 把一个有规律的字符串分成一句话,首字母大写其他小写
- 发现一个规律
- 已经排好的数组,输入一个数,按原来的规律插入数组中;
- 找呀找呀找规律,找到一个好规律
- 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
- 有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
- 根据一个规律文本提取出数据框
- 4.一个字体的随机颜色及有规律的大小变化
- 一个很好玩的jquery例子:小方块先逐渐显示,后向右滑动,再向左滑回,最后向上隐藏
- 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。 输入格式 输入包含一个整
- 浪漫的表白 。刚接触编程语言 ,一个学长做的题。其实很简单,就是找规律输出,只是觉得输出特别浪漫,所以在此作为我人生第一个博客文章!!哈哈,大神之路 走起
- 习题 6.4 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。