题目1081:递推数列

来源:互联网 发布:java 多个list合并 编辑:程序博客网 时间:2024/04/28 00:55

题目1081:递推数列

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:5375

解决:727

题目描述:

给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。

输入:

输入包括5个整数:a0、a1、p、q、k。

输出:

第k个数a(k)对10000的模。

样例输入:
20 1 1 14 5
样例输出:
8359
1 直接使用递归,会发生栈溢出。

import java.util.*;public class Main {public static void main(String arg[]) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int a0 = sc.nextInt();int a1  = sc.nextInt();int p  = sc.nextInt();int q  = sc.nextInt();int k  = sc.nextInt();long answer = func1(a0,a1,p,q,k);System.out.println(answer%10000);}}public static int func1(int a0, int a1, int p, int q, int k) {if(k==1) return a1;if(k==0) return a0;int ak = p*func1(a0, a1, p, q, k-1)+q*func1(a0, a1, p, q, k-2);return ak;}}


2 使用大数循环,会超时

import java.math.BigInteger;import java.util.*;public class Main {public static void main(String arg[]) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){BigInteger a0 = BigInteger.valueOf(sc.nextInt());BigInteger a1  = BigInteger.valueOf(sc.nextInt());BigInteger p  = BigInteger.valueOf(sc.nextInt());BigInteger q  = BigInteger.valueOf(sc.nextInt());BigInteger k  = BigInteger.valueOf(sc.nextInt());BigInteger answer;BigInteger a2;if(k.equals(BigInteger.valueOf(1))) answer = a1;else if(k.equals(BigInteger.valueOf(0))) answer = a0;else{for(int i=2;;i++){a2 = p.multiply(a1).add(q.multiply(a0));a0=a1;a1=a2;if(k.equals(BigInteger.valueOf(i)))  {answer = a2;break;}}}System.out.println(answer.remainder(BigInteger.valueOf(10000)));}}}

3 考虑到


import java.util.*;class rec{int a11;int a12;int a21;int a22;}public class Main {public static void main(String arg[]) {Scanner sc = new Scanner(System.in);while(sc.hasNext()){int a0 = sc.nextInt();int a1  = sc.nextInt();int p  = sc.nextInt();int q  = sc.nextInt();int k  = sc.nextInt();int answer;if(k==0) answer = a0;else  if(k==1) answer = a1;else {rec first = new rec();first.a11=0;first.a12=1;first.a21=q;first.a22=p;rec t = matrixPow(first, k-1);answer = t.a21*a0+t.a22*a1;}System.out.println(answer%10000);}}public static rec mutiply(rec r1,rec r2 ){      rec x = new rec();;      x.a11=0;    x.a12=0;      x.a21=0;    x.a22=0;      x.a11 = (r1.a11*r2.a11+r1.a12*r2.a21)%10000;    x.a12 = (r1.a11*r2.a12+r1.a12*r2.a22)%10000;    x.a21 = (r1.a21*r2.a11+r1.a22*r2.a21)%10000;    x.a22 = (r1.a21*r2.a12+r1.a22*r2.a22)%10000;    return x;  }  public static rec matrixPow(rec r,int k) {     rec temp;      if(k==1) return r;      if(k==2)          return mutiply(r,r);      else      {          if(k%2==0)          {              temp = matrixPow(r ,k/2);              temp = mutiply(temp,temp);              return temp;          }          else          {              temp = matrixPow(r ,k/2);              temp = mutiply(temp ,temp);              temp = mutiply(temp,r);              return temp;          }      }  }}


0 0
原创粉丝点击