题目链接:点击打开链接
题目大意:给出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层开头的数字大小
dp[1] = 0 ;
dp[2] = 0 ;
dp[i] = dp[i-1] + dp[i-2] + 1;
len[i]第i层的长度
len[i] = dp[i+1] + 1 ;
这是n等于15时的表
import java.util.*; import java.math.* ; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in) ; BigInteger dp[] = new BigInteger[1100] ; BigInteger len[] = new BigInteger[1100] ; BigInteger m , t0 , t1 , Mod , x , y ; t0 = new BigInteger("0") ; t1 = new BigInteger("1") ; Mod = new BigInteger("258280327") ; int t , n , i , j ; dp[1] = t0 ; dp[2] = t0 ; len[0] = t0 ; len[1] = t1 ; for(i = 3 ; i <= 1010 ; i++) { dp[i] = t1.add( dp[i-1].add(dp[i-2]) ) ; len[i-1] = len[i-2].add( dp[i].add(t1) ) ; } /* System.out.println( Mod ); for(i = 1 ; i <= 10 ; i++) System.out.println( len[i] ); */ t = cin.nextInt() ; for(i = 0 ; i < t ; i++){ n = cin.nextInt() ; m = cin.nextBigInteger() ; for(j = 1 ; j <= 1010 ; j++) { int k = m.compareTo(len[j]) ; if( k == -1 || k == 0 ) { break ; } } m = m.subtract(len[j-1]) ; m = m.add(dp[j]) ; m = m.subtract(t1) ; m = m.remainder(Mod) ; System.out.println( m ); } } }
Border
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu5351(2015多校5)--MZL's Border(打表,,找规律)
时间: 2024-10-29 19:06:59