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中前两个和末尾两个相同,即黑色部分

解题思路:

一看到题目的数据这么大,理所当然就会想到必定存在规律,先列出几项观察一下

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与结果之间的差值是斐波那契数,仔细观察一下,便会得出这样一个结论:

当我们找到第一个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 }
时间: 2024-12-29 12:32:43

Doom 规律+大数的相关文章

BZOJ1002(找规律+大数)

1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2427  Solved: 1333 [Submit][Status] Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同的n轮状病毒数输出 Sample Input 3 Sample Output 16 题意:RT 思路:dp[n]表示为n的方案数 打表可知

hdu 5351 规律+大数

题目大意:定义了一种fib字符串,问第n个fib串的前m个字母前后相等串的最大长度,大约就是这样的 其实主要读完题意的时候并没有思路,但是列几个fib字符串就会发现,除了fib1以外,所有串的前面都是一样的,后面的串就只是在前面串的基础上再贴一个串而已,因此很明显,这里的n其实读下来并没有什么用,基本只是用来告诉我们总串长是第1000个fib数列的数,因此要大数,我就试着写了java大数.然后这个结果就直接列一些,打表就会发现规律了```然后就没有然后了.恩,别忘了mod 1 import ja

HDOJ-1041 Computer Transformation(找规律+大数运算)

http://acm.hdu.edu.cn/showproblem.php?pid=1041 有一个初始只有一个1的串 每次都按①0 -> 10;②1 -> 01;这两条规则进行替换 形如:n = 1  1 n = 2  01 n = 3  1001 ... 求经过n步替换之后 串中只含复数个0的连续子串(不难发现,这种子串只能是‘00’)的出现次数 因为0<n<=1000的限制 在最坏情况下(n==1000)串的长度将达到2^1000位 排除了直接模拟上述替换过程的可能 列出前几

Resistors in Parallel(找规律+大数)

题意:https://codeforces.com/group/ikIh7rsWAl/contest/254825/problem/E 给你一个n,计算n / Sigma(1~n)的d(是n的只出现一次的因数). 思路: 反正就是打表找规律,3组数据也能找规律,你们是真的nb嗷. 1 import java.math.BigInteger; 2 import java.util.Scanner; 3 4 public class Main{ 5 public static void main(S

简单递推专题

Computer Transformation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6084    Accepted Submission(s): 2222 Problem Description A sequence consisting of one digit, the number 1 is initially wri

UVALive 6270 Edge Case(找规律,大数相加)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 找规律,前两个数的和等于后一个数的值: 其实就是大菲波数: 代码如下: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #include<cstdio> #include<cst

Acdream 1210 Chinese Girls&#39; Amusement(大数模板运算 + 找规律)

传送门 Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You must have heard that the Chinese culture is quite different from that of Europe or Rus

大数+找规律 ACdream1210 Chinese Girls&#39; Amusement

传送门:点击打开链接 题意:对于n个点围成的圈.从一个点出发,顺时针数K个位置,一直进行这个操作直到回到最初的那个点时,恰好把所有的点都访问了一遍,问最大的K(K<=n/2) 思路:很容易就想到了一种方法,找到K<=n/2,且gcd(K,n)=1,有人是用java从n/2向1去枚举的,感觉好暴力,所以当时不敢这样写 后来发现其实是有规律的,从n=3一直算下去,会得到一个这样的序列1 1 2 1 3 3 4 3 5 5 6 5 7 7 8 7 9 9 10 9..... 很明显以4个为一组,一下

UVA 11774 - Doom&amp;#39;s Day(规律)

UVA 11774 - Doom's Day 题目链接 题意:给定一个3^n*3^m的矩阵,要求每次按行优先取出,按列优先放回,问几次能回复原状 思路:没想到怎么推理,找规律答案是(n + m) / gcd(n, m),在topcoder上看到一个证明,例如以下: We can associate at each cell a base 3-number, the log3(R) most significant digits is the index of the row of the cel