[高精度][规律][二分] Jzoj P4213 对你的爱深不见底

Description

出乎意料的是,幸运E 的小R 居然赢了那个游戏。现在欣喜万分的小R 想要写一张明信片给小Y,但是因为小R 非常羞涩,所以他打算采用一些比较神奇的方式来表达。
他定义了一些字符串,s1 = a,s2 = b,si =s_i-1  +  s_i-2  (i >=3)。同时他定义了一个字符串s 的权值为一个最大的i <|s|满足s 长度为i 的前缀等于长度为i 的后缀。比如字符串aba 的权值就是1,abab 的权值就是2,aaaa 的权值就是3。
现在小R 在明信片上给出了两个数n 和m,他想要告诉小Y 的信息是字符串sn 的前m个字符组成的字符串的权值。你可以帮小Y 计算一下吗?

Input

第一行输入一个正整数T 表示数据组数。
对于每组数据,第一行是两个整数n;m。保证1<= m <=|sn|

Output

对于每组数据,输出一个整数表示答案。答案可能很大,你只需要输出模258280327 后的答案。

Sample Input

2
4 3
5 5

Sample Output

1
2

Data Constraint

对于30% 的数据,n <= 20
对于60% 的数据,n <= 60
对于100% 的数据,n <= 10^3,1 <= T <= 100

题解

  • 这就是道打表找规律的题目,至于怎么证明有没有大佬教一教
  • 找到第一个斐波那契数列长度n大于m+1,答案就是 m-|n-2|
  • 然后就要上高精度了,因为我们还要找到n,打个二分

代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #define mo 258280327
 5 #define N 1010
 6 using namespace std;
 7 struct edge{ int a[1005],l; }f[N],p;
 8 int T,n,P[N];
 9 void add(edge &x,edge &y,edge &k)
10 {
11     for (int i=1;i<k.l+1;i++) k.a[i]=0; k.l=0;
12     for (int i=1;i<=max(x.l,y.l);i++) k.a[i]+=x.a[i]+y.a[i],k.a[i+1]+=k.a[i]/10,k.a[i]%=10;
13     k.l=max(x.l,y.l); while (k.a[k.l+1]) k.l++,k.a[k.l+1]=k.a[k.l]/10,k.a[k.l]%=10;
14 }
15 bool check(edge a,edge b)
16 {
17     if (a.l!=b.l) return a.l<b.l;
18     for (int i=a.l;i;i--) if (a.a[i]!=b.a[i]) return a.a[i]<b.a[i];
19     return 0;
20 }
21 int main()
22 {
23     scanf("%d",&T),f[1].a[1]=f[1].l=f[2].a[1]=f[2].l=1;
24     for (int i=3;i<=1001;i++) add(f[i-2],f[i-1],f[i]);
25     while (T--)
26     {
27         scanf("%d",&n),memset(p.a,0,sizeof(p.a)),p.l=0;
28         char ch; while (ch=getchar(),ch<‘0‘||ch>‘9‘);
29         P[p.l=1]=ch-48; while (ch=getchar(),ch>=‘0‘&&ch<=‘9‘) P[++p.l]=ch-48;
30         for (int i=p.l;i;i--) p.a[p.l-i+1]=P[i]; p.a[1]++;
31         for (int i=1;i<=p.l;i++) p.a[i+1]+=p.a[i]/10,p.a[i]%=10;
32         if (p.a[p.l+1]) p.l++;
33         int l=1,r=1001,q=0;
34         while (l<=r)
35         {
36             int mid=l+r>>1;
37             if (check(p,f[mid])) q=mid,r=mid-1; else l=mid+1;
38         }
39         q-=2,p.a[1]--;
40         for (int i=1;i<=f[q].l;i++)
41         {
42             p.a[i]-=f[q].a[i];
43             if (p.a[i]<0) p.a[i]+=10,p.a[i+1]--;
44         }
45         while (p.l>1&&!p.a[p.l]) p.l--;
46         q=0; for (int i=p.l;i;i--) q=(q*10ll+p.a[i])%mo;
47         printf("%d\n",q);
48     }
49 }

原文地址:https://www.cnblogs.com/Comfortable/p/10316777.html

时间: 2024-07-31 06:59:10

[高精度][规律][二分] Jzoj P4213 对你的爱深不见底的相关文章

POJ - 2109 Power of Cryptography(高精度log+二分)

Current work in cryptography involves (among other things) large prime numbers and computing powers of numbers among these primes. Work in this area has resulted in the practical use of results from number theory and other branches of mathematics onc

【8.31校内测试】【找规律二分】【DP】【背包+spfa】

打表出奇迹!表打出来发现了神奇的规律: 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 16 16... 嗯嗯嗯?没有规律?我们把每个数出现的次数列出来: 2 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 然后惊觉表中的数字是连续的,每个都至少有一个,而分解因数中有只要2的幂,有一个就会加一,比如8是2.4.8的倍数,在1的基础上会多三个.(1和2除外) 所以对于一个位置$x$,我们可

POWEROJ 1168-A F(x)(找规律&amp;二分查找)

题目链接:1168-A 题意 Time Limit: 1000 MS Memory Limit: 65536 KB Description 小明有一个不降序列(f(1),f(2),f(3),--),f(k)代表在这个序列中大小是k的有f(k)个.我们规定f(n)的前12项如下图. n 1 2 3 4 5 6 7 8 9 10 11 12 f(n) 1 2 2 3 3 4 4 4 5 5 5 6 现在给你一个n,你知道f(n)是多少吗? Input 多组测试数据 每组一个n(1<=n<=2000

HDU 2289 Cup【高精度,二分】

Cup Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8942    Accepted Submission(s): 2744 Problem Description The WHU ACM Team has a big cup, with which every member drinks water. Now, we know th

[DP][二分]JZOJ 3463 军训

Description HYSBZ 开学了!今年HYSBZ 有n 个男生来上学,学号为1-n,每个学生都必须参加军训.在这种比较堕落的学校里,每个男生都会有Gi 个女朋友,而且每个人都会有一个欠扁值Hi.学校为了保证军训时教官不会因为学生们都是人生赢家或者是太欠扁而发生打架事故,所以要把学生们分班,并做出了如下要求: 1.分班必须按照学号顺序来,即不能在一个班上出现学号不连续的情况. 2.每个学生必须要被分到某个班上. 3.每个班的欠扁值定义为该班中欠扁值最高的那名同学的欠扁值.所有班的欠扁值之

Really Big Numbers CodeForces - 817C (数学规律+二分)

C. Really Big Numbers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Ivan likes to learn different things about numbers, but he is especially interested in really big numbers. Ivan thinks

[DP][二分]JZOJ 3467 最长上升子序列

Description 维护一个序列,使它可以进行下面两种操作: 1.在末尾添加一个数字x 2.将整个序列变成第x次操作后的样子 在每次操作后,输出当前序列的最长上升子序列的长度 序列初始时为空 Input 输入文件lis.in的第一行有一个正整数n,表示操作个数.接下来n行每行有两个整数op,x.如果op为0,则表示添加x这个数字:如果op为1,则表示回到第x次操作之后. Output 对于每次操作,在输出文件lis.out中输出一个答案,表示当前最长上升子序列的长度 Sample Input

创业者:生得无奈,活得憋屈

自阿里巴巴登录纽交所,马云成为中国乃至亚洲首富之后,有关他的传说就从未停止过,一些网友自己瞎编的心灵鸡汤也统统扣到了大帅头上,在最疯狂的时候,你甚至搞不清楚马云究竟是一位企业家,还是一位相声演员,以至于大帅不得不亲自辟谣:有些话,真不是我说的.诚然,企业家明星化有利于传播社会正能量和行业内的创业思路,也能让中国人的信仰多元化,倒也比单纯地崇拜钟汉良.都教授更健康一些,但明星企业家的言论带给普通年轻人的导向性会更强,需要更加谨慎,毕竟,他们都曾取得过成功,也都有钱. 笔者认为,时下中国年轻人掀起的

浅谈微服务的来龙去脉

作者:王清培(Plen wang) 沪江 公共业务平台 应用架构师 转载至沪江技术学院微信公众号 背景介绍 最近一段时间公共业务平台在进行大面积的重构,对原来的技术栈进行迁移,逐渐往Java.Go.Node.js等开源.自由为主的技术体系中过度. 虽然这主要是替换技术框架,但也是我们应用系统进行重新设计.业务流程重新梳理的一个好机会,我们将利用这次机会来重构之前发现的一些问题. Martin Fowler大师<重构>一书中有说过一句话,大概意思就是,"每次对原有系统进行修改调整的时候