标签:
题目链接:点击打开链接
题目大意:给出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 );
}
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu5351(2015多校5)--MZL's Border(打表,,找规律)
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/47281573