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;
//                 }
                }
            }
        }
    }
}



转载于:https://www.cnblogs.com/maplefighting/p/7375683.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值