斐波那契素数原理-西电acm 1249泡馍题做题感想
2013-05-13 21:54
302 查看
题目:lbw很喜欢吃羊肉泡馍,有一天他做关于斐波那契数列的问题时候突然想为何不定义一种羊肉泡馍数呢?斐波那契数列大家
都知道就是f
=f[n-1]+f[n-2],f[1]=f[2]=1,那么现在定义羊肉泡馍数,首先每个羊肉泡馍数都要是斐波那契数,
其次每个羊肉泡馍数要与小于该数的所有斐波那契数都互质,第一个羊肉泡馍数是2,第二个是3,第三个是5,第四个是13。
那么,第n个羊肉泡馍数是多少呢?
Input
一个数n(0<n<=22000),表示第n个羊肉泡馍数。
Output
输出第n个羊肉泡馍数的前九位,如果这个数不超过九位,输出该数。
1.首先用到一个斐波那契素数原理:
哪些的Fibonacci数才是Fibonacci质数呢?这里先给出结论:
1. F(3)和F(4)是Fibonacci质数;从F(5)开始,某项为Fibonacci质数当且仅当它的项数为质数
2. 第k小的Fibonacci质数是以质数数列中的第k个数为项数的Fibonacci数( 除F(3)和F(4)之外 )
2.有了上面的定理就好办了;不过要注意会超过范围 这里用long double 可以保存很大很大的数据 同时又能保证前几位的精度;
因此我们就要知道第22000个素数大概在什么范围。10^6之内可以产生7万多个素数,因此我们可以先把10^6内的素数筛出来存到数组里,以便后面使用。
这个可以作为一个常识吧;
3.另外求第n个斐波那契数可以用递推打表法,也可以用一个原理,如下; http://blog.sina.com.cn/s/blog_6ea2c6a20100x359.html 4.对于大数,有三种处理方法:int数组,char数组,和双精度 如longlong 甚至long double;
5.这份代码学了一个技巧就是怎么保留前面9位
6.最后给出代码
都知道就是f
=f[n-1]+f[n-2],f[1]=f[2]=1,那么现在定义羊肉泡馍数,首先每个羊肉泡馍数都要是斐波那契数,
其次每个羊肉泡馍数要与小于该数的所有斐波那契数都互质,第一个羊肉泡馍数是2,第二个是3,第三个是5,第四个是13。
那么,第n个羊肉泡馍数是多少呢?
Input
一个数n(0<n<=22000),表示第n个羊肉泡馍数。
Output
输出第n个羊肉泡馍数的前九位,如果这个数不超过九位,输出该数。
1.首先用到一个斐波那契素数原理:
哪些的Fibonacci数才是Fibonacci质数呢?这里先给出结论:
1. F(3)和F(4)是Fibonacci质数;从F(5)开始,某项为Fibonacci质数当且仅当它的项数为质数
2. 第k小的Fibonacci质数是以质数数列中的第k个数为项数的Fibonacci数( 除F(3)和F(4)之外 )
2.有了上面的定理就好办了;不过要注意会超过范围 这里用long double 可以保存很大很大的数据 同时又能保证前几位的精度;
因此我们就要知道第22000个素数大概在什么范围。10^6之内可以产生7万多个素数,因此我们可以先把10^6内的素数筛出来存到数组里,以便后面使用。
这个可以作为一个常识吧;
3.另外求第n个斐波那契数可以用递推打表法,也可以用一个原理,如下; http://blog.sina.com.cn/s/blog_6ea2c6a20100x359.html 4.对于大数,有三种处理方法:int数组,char数组,和双精度 如longlong 甚至long double;
5.这份代码学了一个技巧就是怎么保留前面9位
int flag=0; for(int i=5; i<=N; i++) //从第5项开始构建fib { if(flag) //说明前一项曾经降位 { fib[i]=fib[i-1]+fib[i-2]/10; flag=0; } //为了对应计算当前项,前二项要降位再相加 //先默认当前fib不超过9为,将flag恢复为0, else fib[i]=fib[i-1]+fib[i-2]; if(fib[i]>E) //已经超过9位,当前的fib要降一位 { fib[i]/=10; flag=1; } }
6.最后给出代码
#include <stdio.h> #include <string.h> #include <math.h> bool isprime[250010]; int prime[25010]; long double fib[250010]; int main() { memset(isprime,0,sizeof(isprime)); for(int i=2; i<=500; i++) { for(int j=i*i; j<=250000; j+=i) isprime[j]=1; } int p=1; for(int i=2; i<=250000; i++) { if(!isprime[i]) { prime[p++]=i; } } prime[1]=3; prime[2]=4; memset(fib,0,sizeof(fib)); fib[0]=fib[1]=1; int flag=0; for(int i=2; i<=250000; i++) { if(flag==1){fib[i]=fib[i-1]+fib[i-2]/10;flag=0;} else {fib[i]=fib[i-1]+fib[i-2];flag=0;} if(fib[i]>1e9){fib[i]/=10;flag=1;} } int n; while(scanf("%d",&n)==1) { printf("%d\n",(int)fib[prime -1]); } return 0; }
相关文章推荐
- 斐波那契素数原理-西电acm 1249泡馍题做题感想
- 2016.11.12 做题感想
- ACM-ICPC北京赛区2015 A hihoCoder 1249 Xiongnu's Land
- ACM大一练习赛-第三场——A - 海森堡不确定原理
- ACM做题过程中知识点学习
- 一个西电的ACM竞赛题想到的 part2
- ACM递推递归练习K 们--加强斐波那契
- ACM: 广搜+素数 poj 3126 (素数表…
- ACM长沙赛区 Goldbach——素数筛
- ACM之素数环(DFS)
- ACM 做题过程中的一些小技巧。
- acm练习:求最近的素数
- 邝斌的ACM模板(素数筛选和合数分解)
- ACM一道关于素数查找的题
- ACM(013)Fibonacci(斐波那契)数(1)
- ACM-素数
- ACM 24 素数距离问题(记录距离最近的素数)
- BFS在ACM中的原理和应用
- 杭电ACM 2012 素数判定
- ACM感想