hdu 5351 MZL's Border 打表+高精度

MZL‘s Border

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 462    Accepted Submission(s): 127

Problem Description

As is known to all, MZL is an extraordinarily lovely girl. One day, MZL was playing with her favorite data structure, strings.

MZL is really like Fibonacci Sequence, so she defines Fibonacci Strings in the similar way. The definition of Fibonacci Strings is given below.
  
  1) fib1=b
  
  2) fib2=a
  
  3) fibi=fibi−1fibi−2, i>2
  
For instance, fib3=ab, fib4=aba, fib5=abaab.

Assume that a string s whose length is n is s1s2s3...sn. Then sisi+1si+2si+3...sj is called as a substring of s, which is written as s[i:j].

Assume that i<n. If s[1:i]=s[n−i+1:n], then s[1:i] is called as a Border of s. In Borders of s, the longest Border is called as s‘ LBorder. Moreover, s[1:i]‘s LBorder is called as LBorderi.

Now you are given 2 numbers n and m. MZL wonders what LBorderm of fibn is. For the number can be very big, you should just output the number modulo 258280327(=2×317+1).

Note that 1≤T≤100, 1≤n≤103, 1≤m≤|fibn|.

Input

The first line of the input is a number T, which means the number of test cases.

Then for the following T lines, each has two positive integers n and m, whose meanings are described in the description.

Output

The output consists of T lines. Each has one number, meaning fibn‘s LBorderm modulo 258280327(=2×317+1).

Sample Input

2
4 3
5 5

Sample Output

1
2

题意:

给出一个类似斐波那契数列的字符串序列。

f[1] = b

f[2] = a

f[3] = f[2]+f[1] = ab

f[4] = aba

f[5] = abaab

要你求给出的f[n]字符串中截取前m位的字符串s中

s[1...i] = s[s.size()-i+1....s.size()]的最大长度。

...

给出n = 5, m = 5;

则f[5] = abaab.截取前m位是abaab.

所以最长的就是s[0-1] = s[3-4] = ab 答案= 2;

如果 n = 5, m = 4;

f[5] = abaab,截取前4位 就是abaa

那么最长应该是s[0] = s[3] = a.答案 = 1.

暴力打表找一下规律,然后用大数做

总结一下常用的BigInteger的用法:

这个类在java.math中.

构造方法:BigInteger b = new BigInteger("");  //用字符串构造.

常量:BigInteger.ONE; BigInteger.ZERO; BigInteger.TEN;

加法:add 减法:subtract 乘法:multiply 除法:divide 取余:remainder

比较大小 compareTo 返回0 表示相等,返回1表示比后者大,返回-1表示比后者小。

 1 import java.math.BigInteger;
 2 import java.util.Scanner;
 3
 4
 5 public class Main {
 6
 7     static BigInteger[] fib1 = new BigInteger[1010];
 8     static BigInteger[] fib2 = new BigInteger[1010];
 9     static BigInteger[] fib3 = new BigInteger[1010];
10     public static void main(String []args)
11     {
12         fib1[1] = new BigInteger("2");
13         fib1[2] = new BigInteger("2");
14         fib2[1] = BigInteger.ONE; fib2[2] = BigInteger.ONE;
15         fib3[1] = BigInteger.ZERO; fib3[2] = BigInteger.ONE;
16
17         for(int i = 3; i <= 1005; i++)
18         {
19             fib1[i] = fib1[i-1].add(fib1[i-2]);
20             fib2[i] = fib2[i-1].add(fib2[i-2]);
21         }
22         for(int i = 3; i <= 1005; i++)
23         {
24             fib3[i] = fib3[i-1].add(fib2[i-1]);
25         }
26
27         Scanner in = new Scanner(System.in);
28         int T = in.nextInt(), maxN = 0;
29         for(int cast = 1; cast <= T; cast++)
30         {
31             int n; BigInteger m;
32             n = in.nextInt();
33             m = in.nextBigInteger();
34             int i;
35             for(i = 1; i <= 1005; i++)
36             {
37                 if(m.compareTo(fib1[i]) == 1)
38                 {
39                     m = m.subtract(fib1[i]);
40                 }
41                 else break;
42             }
43             if(m.compareTo(fib1[i].divide(new BigInteger("2"))) == 1)
44             {
45                 m = m.subtract(fib1[i].divide(new BigInteger("2")));
46                 BigInteger ans = m.add(fib3[i]);
47                 ans = ans.subtract(BigInteger.ONE);
48                 ans = ans.remainder(new BigInteger("258280327"));
49                 System.out.println(ans.toString());
50             }
51             else
52             {
53                 BigInteger ans = m.add(fib3[i]);
54                 ans = ans.subtract(BigInteger.ONE);
55                   ans = ans.remainder(new BigInteger("258280327"));
56                 System.out.println(ans.toString());
57             }
58         }
59     }
60 }

hdu 5351 MZL's Border 打表+高精度

时间: 2024-10-27 13:04:42

hdu 5351 MZL's Border 打表+高精度的相关文章

HDU 5351 MZL&#39;s Border(找规律+高精度)

MZL's Border Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 895    Accepted Submission(s): 287 Problem Description As is known to all, MZL is an extraordinarily lovely girl. One day, MZL was p

HDU 5351——MZL&#39;s Border——————【高精度+找规律】

MZL's Border Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 944    Accepted Submission(s): 306 Problem Description As is known to all, MZL is an extraordinarily lovely girl. One day, MZL was pl

HDU 5351 MZL&#39;s Border(java 找规律)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5351 Problem Description As is known to all, MZL is an extraordinarily lovely girl. One day, MZL was playing with her favorite data structure, strings. MZL is really like Fibonacci Sequence, so she defin

多校-HDU 5351 MZL&#39;s Border 数学

f[1] = 'b', f[2] = 'a', f[i] = f[i - 1] + f[i - 2] 斐波那契数列的字符串,给你n和m,前m位中,最长的前缀等于后缀的长度是多少.1≤n≤1000, 1≤m≤length(f[n]) 规律题,虽然我不知道为什么. 1 import java.io.*; 2 import java.util.*; 3 import java.math.*; 4 public class Main{ 5 //Scanner cin = Scanner(System.i

HDU 5351 MZL&#39;s Border(规律)

MZL's Border Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 835    Accepted Submission(s): 268 Problem Description As is known to all, MZL is an extraordinarily lovely girl. One day, MZL was p

HDOJ 5351 MZL&#39;s Border 找规律

打出前i个串的kmp的fail指针: p: ab 0 0 0 p: aba 0 0 0 1 p: abaab 0 0 0 1 1 2 p: abaababa 0 0 0 1 1 2 3 2 3 p: abaababaabaab 0 0 0 1 1 2 3 2 3 4 5 6 4 5 p: abaababaabaababaababa 0 0 0 1 1 2 3 2 3 4 5 6 4 5 6 7 8 9 10 11 7 8 p: abaababaabaababaababaabaababaabaab

HDU 5347(MZL&amp;#39;s chemistry-打表)

MZL's chemistry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 629    Accepted Submission(s): 449 Problem Description MZL define as the first ionization energy of the chemical element Now he g

hdu5351(2015多校5)--MZL&#39;s Border(打表,,找规律)

题目链接:点击打开链接 题目大意:给出b1 = 'b' , b2 = 'a' , bi = b(i-1)b(i-2),将i-1和i-2链接起来,记录一个串的s[1-i] 和s[n-i+1-n]相同的话 Border,当i为最长是为LBorder,现在给让求在bn这个串上的前m个字符组成的子串的LBorder 通过计算可以发现,b字符串的前缀都是相同的,所以只要求出m的LBorder就行,和n是无关的,打表找出规律,找出对应不同的m,LBorder的值,因为存在大数,用java写 dp[i]第i层

HDU 5347(2015多校5)-MZL&#39;s chemistry(打表)

题目地址HDU 5347 无脑流神题,自行脑补,百度大法好. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #