Doom 规律+大数
Doom
比賽的時候沒有做出來,補題。
題意:題目定義了一個斐波那契串
1) fib1=b;
2) fib2=a;
3) fibi=fibi-1fibi-2,i>2
舉例,fib3=ab,fib4=aba,fib5=abaab
我們暫時將字符串sisi+1si+2si+3…sj記做s[i:j]
求滿足s[1:i]=s[m-i+1:m](i<m)的i的最大值,記做LBorderm
例如m=5時,LBorderm=2,因為abaab中前兩個和末尾兩個相同,即黑色部分
解題思路:
一看到題目的數(shù)據(jù)這么大,理所當然就會想到必定存在規(guī)律,先列出幾項觀察一下
m ?LBorderm??D-value(差值)
1 ? ? ? ? ?0 ? ? ? ? ? ? ? 1
2 ? ? ? ? ?0 ? ? ? ? ? ? ? 2
3 ? ? ? ? ?1 ? ? ? ? ? ? ? 2
4 ? ? ? ? ?1 ? ? ? ? ? ? ? 3
5 ? ? ? ? ?2 ? ? ? ? ? ? ? 3
6 ? ? ? ? ?3 ? ? ? ? ? ? ? 3
7 ? ? ? ? ?2 ? ? ? ? ? ? ? 5
8 ? ? ? ? ?3 ? ? ? ? ? ? ? 5
9 ? ? ? ? ?4 ? ? ? ? ? ? ? 5
10 ? ? ? ?5 ? ? ? ? ? ? ? 5
11 ? ? ? ?6 ? ? ? ? ? ? ? 5
12 ? ? ? ?4 ? ? ? ? ? ? ? 8
13 ? ? ? ?5 ? ? ? ? ? ? ? 8
14 ? ? ? ?6 ? ? ? ? ? ? ? 8 ?
由上述例子可知,m與結果之間的差值是斐波那契數(shù),仔細觀察一下,便會得出這樣一個結論:
當我們找到第一個i滿足m+1<|fibi|時,LBorderm=m-|fibi-2|(|fibi-2|表示斐波那契串fibi-2的長度) ?
1 import java.util.*; 2 import java.io.*; 3 import java.math.*; 4 5 public class Main { 6 public static Scanner cin = new Scanner(new BufferedInputStream(System.in)); 7 public final static int MS = 1005; 8 public final static BigInteger MOD = new BigInteger("258280327"); 9 public final static BigInteger[] fib = new BigInteger[MS]; 10 static { 11 fib[1] = BigInteger.ONE; 12 fib[2] = new BigInteger("2"); 13 for(int i = 3; i < MS; i++) 14 fib[i] = fib[i - 1].add(fib[i - 2]); 15 } 16 public static void main(String[] args) { 17 int T, n; 18 BigInteger m; 19 T = cin.nextInt(); 20 while (T-- > 0) { 21 n = cin.nextInt(); 22 m = cin.nextBigInteger(); 23 m.add(BigInteger.ONE); 24 for (int i = 1; i < MS; i++) { 25 if (fib[i].compareTo(m) > 0) { 26 System.out.println(m.subtract(fib[i - 2]).mod(MOD)); 27 break; 28 } 29 } 30 } 31 } 32 }?
轉載于:https://www.cnblogs.com/hutaishi/p/4705902.html
總結
以上是生活随笔為你收集整理的Doom 规律+大数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS笔记之样式
- 下一篇: 航开路有汽车站吗?离人民医院多远