acm 之fib数列——java

1022. Fib数列

Description

定义Fib数列:1,1,2,3,5,8,13,…

求第N项除以2010的余数

Input Format

输入仅一行,为一个整数N

Output Format

输出仅一行,为第N项除以2010的余数

Sample Input

3

Sample Output

2

Limits:

对于70%的数据 N≤1,000,000

对于100%的数据 N≤210,000,000,000

这道题最让人着急的是数太大了,而且不可以使用递归,这种方法会暴栈,但是java里有大数类,天然的优势,代码如下:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

	private static Scanner in;
	public static void main(String[] args) {
		in = new Scanner(System.in);
		long n=in.nextLong();
		Main m =new Main();
		BigInteger res =m.fib(n);
		System.out.print((res.divideAndRemainder(new BigInteger("2010")))[1]);
	}
	BigInteger fib(long n){
		 if(n==1 || n==2){
			 return new BigInteger("1");
		 }else{
			 BigInteger pnum=new BigInteger("1");
			 BigInteger cnum=new BigInteger("1");
			 for(int i=3;i<=n;i++){
				 cnum= cnum.add(pnum);
				 pnum =cnum.subtract(pnum);
			 }
			 return cnum;
		 }
	}
}

  但是很令人忧伤的是即使使用大数类保存数据,即使循环只有n次,也会超时、、、、、无奈的只好百度一下发现,fib数列对2010取余后竟是周期数列,周期是2040、、

所以更改代码如下:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

	private static Scanner in;
	public static void main(String[] args) {
		in = new Scanner(System.in);
		long n=in.nextLong();
		Main m =new Main();
		if(n%2040==0){
			System.out.print(0);
		}else{
			BigInteger res = m.fib(n%2040);
			System.out.print((res.divideAndRemainder(new BigInteger("2010")))[1]);
		}
	}
	BigInteger fib(long n){
		 if(n==1 || n==2){
			 return new BigInteger("1");
		 }else{
			 BigInteger pnum=new BigInteger("1");
			 BigInteger cnum=new BigInteger("1");
			 for(int i=3;i<=n;i++){
				 cnum= cnum.add(pnum);
				 pnum =cnum.subtract(pnum);
			 }
			 return cnum;
		 }
	}
}

这就可以通过了、、、、这是java的福利  

但是,有大神用C++没有使用大数,而且用时超少、、、、

acm 之fib数列——java,布布扣,bubuko.com

时间: 2024-10-10 11:07:55

acm 之fib数列——java的相关文章

HDU 1005 Number Sequence 矩阵乘法 Fib数列

原题: http://acm.hdu.edu.cn/showproblem.php?pid=1005 题目大意: 按规律求出第n项. 由矩阵乘法我们可以知道: 所以对于fib数列我们可以用矩阵来求,由于矩阵可以左乘右乘,所以我们可以用快速幂来优化. #include<iostream> #include"string.h" #include<stdio.h> using namespace std; const int bc=2; const int mod =

动态规划之Fib数列类问题应用

一,问题描述 有个小孩上楼梯,共有N阶楼梯,小孩一次可以上1阶,2阶或者3阶.走到N阶楼梯,一共有多少种走法? 二,问题分析 DP之自顶向下分析方式: 爬到第N阶楼梯,一共只有三种情况(全划分,加法原理),从第N-1阶爬1阶到第N阶:从第N-2阶爬2阶到第N阶:从第N-3爬3阶到第N阶. 故:way(N)=way(N-1)+way(N-2)+way(N-3) 这与求Fib数列非常相似,当然,其他类似的问题也可以这样求解. 初始条件: way(1)=1 way(2)=2 way(3)=4 三,代码

FIB数列

斐波那契级数除以N会出现循环,此周期称为皮萨诺周期. 下面给出证明 必然会出现循环 这是基于下面事实: 1. R(n+2)=F(n+2) mod P=(F(n+1)+F(n)) mod P=(F(n+1) mod p +F(n) modp) mod p 2. 斐波那契数列的最大公约数定理:gcd(F(m),F(n))=F(gcd(m,n)) 最大公约数定理表明如果F(k)能被N整除,则F(ik)也能被N整除,这就表明了斐波那契数列所含因子的周期性,下面列举: 因子:2,3,4,5, 6,7,8,

ACM试题 - 括号配对问题 - Java中字符串截取和定位问题

ACM试题题源(括号配对问题):http://acm.nyist.net/JudgeOnline/problem.php?pid=2 提交代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); String[] ans = new String[n];

1022. Fib数列

Description 定义Fib数列:1,1,2,3,5,8,13,- 求第N 项除以2010 的余数 Input Format 输入仅一行,为一个整数N Output Format 输出仅一行,为第N 项除以2010 的余数 Sample Input 3 Sample Output 2 Limits: 对于70%的数据 N≤1,000,000 对于100%的数据 #include<iostream>using namespace std; int main(){    int t;    

UVaLive 3357 Pinary (Fib数列+递归)

题意:求第 k 个不含前导 0 和连续 1 的二进制串. 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题,其子问题也就是Fib,这样就可以用递归来解决了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include

[bzoj5118]Fib数列2_费马小定理_矩阵乘法

Fib数列2 bzoj-5118 题目大意:求Fib($2^n$). 注释:$1\le n\le 10^{15}$. 想法:开始一看觉得一定是道神题,多好的题面啊?结果...妈的,模数是质数,费马小定理就tm完事了,将fib数列的通项公式列出来然后费马小定理... 最后,附上丑陋的代码... ...(照着郭爷一顿瞎jb敲) #include <iostream> #include <cstdio> #include <cstring> #include <algo

用HashMap优化斐波那契数列 java算法

斐波那契是第一项为0,第二项为1,以后每一项是前面两项的和的数列. 源码:Fibonacci.java public class Fibonacci{ private static int times=0; public static void main(String args[]){ int nums = fibonacci(30); System.out.println("结果:"+nums); System.out.println("次数:"+times);

Fibnacci数列Java实现

Fibnacci数列:如是:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] f(0) = 1; f(1) = 1; f(n) = f(n-1)+f(n-2) n>1; 1 import java.util.Arrays; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 Test test = new Test(); 7 int n = 15; 8 int[] fibnacc