hdu5351

題目名稱:MZL's Border

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5351


題意:給出fib = b,fib= a ; fib = fib i-1 fib i-2 ,這個遞推關係,例如,fib = ab,fib = aba 然後說了一大堆東西,其實就是要我們求前m個字母中滿足 i < n , s [ 1 : i ]=s [ n - i - 1 : n ] ,( s [ 1 : i ]表示串 s 的子串s1s2s3s4s4...si ) 的 i 的最大值


思路:看到這道題是不是自然而然的就想到了KMP,對,一開始我用KMP準備把最大的那個串給保存在next數組裏面,由於該串是斐波拉切增長的,,所以數組爆了,然後這道題每一次是把上一個串加到後面,所以想到了打表找規律,0  0 | 1  1 | 2 3  2 3 | 4 5 6  4 5 6 | 7 8 9 10 11  7 8 9 10 11 | 12 13 14 15 16 17 18 19  12 13 14 15 16 17 18 19  這樣是不是規律就出來了啊==,然後還得用高精度==,由於JAVA 的高精度比較容易寫,下面給出JAVA的代碼


代碼如下:

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		int t;
		while(in.hasNext())
        {
			t=in.nextInt();
            for(int pp=0;pp<t;pp++)
            {
                BigInteger n,m,sum=BigInteger.ONE;
                BigInteger cnt=BigInteger.ZERO;
                BigInteger ss[] = new BigInteger[3];
                ss[1]=BigInteger.ONE;ss[0]=BigInteger.ONE;
                cnt=new BigInteger("4");
                n = in.nextBigInteger();
                m = in.nextBigInteger();
                BigInteger two = new BigInteger("2");
                if(new BigInteger("3").compareTo(m)==1)                   //m<3
                    System.out.println("0");
                else{
                    for(;;)
                    {
                        ss[2]=ss[1].add(ss[0]);
                        if(( (cnt.add(ss[2].add(ss[2]))).compareTo(m) ) ==1)    //cnt+ss[2]*2>m
                            break;
                        cnt=cnt.add(ss[2].add(ss[2]));                          //cnt=cnt+ss[2]*2
                        sum=(sum.add(ss[2])).mod(new BigInteger("258280327"));  //sum=(sum+ss[2])%258280327
                        ss[0]=ss[1];
                        ss[1]=ss[2];
                    }
                    if(m.subtract(cnt).compareTo(ss[2])==1)
                        System.out.println( (m.subtract(ss[2]).add(sum).subtract(cnt)).mod(new BigInteger("258280327")));
                    else
                        System.out.println( (m.add(sum).subtract(cnt) ) .mod(new BigInteger("258280327")));
//                if(m-cnt>ss[2])
//                    cout<<(m-ss[2]+sum-cnt)%258280327<<endl;
//                else
//                    cout<<(m+sum-cnt)%258280327<<endl;
//                 }
                }
            }
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章