HDU 5351 MZL's Border (规律,大数)
[HDU 5351 MZL's Border]
题意
定义字符串$f_1=b,f_2=a,f_i=f_{i-1}f_{i-2}$。
对$f_n$的长度为$m$的前缀$s$,
求最大的$k$满足$s[1]=s[m-k+1],s[2]=s[m-k+2]...s[k]=s[m]$
Solution
先列出前几个字符串
$f_3=ab,f_4=aba,f_5=abaab,f_6=abaababa,f_7=abaababaabaab$。
对于n,m。
假设$f_{n-1}$的长度大于等于$m$,那么相当于求n-1,m。
假设$f_{n-1}$的小于$m$
由斐波那契的性质,答案要么是$m-length(f_{n-1})$,
要么是$m-length(f_{n-2})$
通过对前几个字符串的分析可以发现,当$m+1<length(f_n)$时答案是后者。
于是只要先把前1000个字符串的长度求出来。需要使用高精度。
然后直接按照上面的规则判断就行了。
#include <bits/stdc++.h>
#define lson x << 1
#define rson x << 1 | 1
#define LL long long
#define se second
#define fi first
#define LL long long
using namespace std; const int N = ; string fib[N], m, ans; inline string add ( string a, string b )
{
if ( a.size() < b.size() ) swap ( a, b );
int la = a.size(), lb = b.size(), x = , i = ;
for ( i = ; i < lb; ++i ) {
x += ( a[i] - '' + b[i] - '' );
a[i] = '' + x % ;
x /= ;
}
while ( x && i < la ) {
x += ( a[i] - '' );
a[i] = '' + x % ;
x /= ;
++i;
}
if ( x ) a += '' + x;
return a;
} inline string sub ( string a, string b )
{
int la = a.size(), lb = b.size(), x = , i = ;
for ( i = ; i < lb; ++i ) {
if ( a[i] - x >= b[i] ) {
a[i] = a[i] - x - b[i] + '';
x = ;
} else {
a[i] = + '' + a[i] - b[i] - x;
x = ;
}
}
while ( x && i < la ) {
if ( a[i] != '' ) {
a[i] = a[i] - ;
x = ;
} else {
a[i] = '';
++i;
}
}
i = la - ;
while ( a[i] == '' && i != ) {
a.erase ( a.begin() + i );
--i;
}
return a;
} int T, n; inline bool pd ( string a, string b )
{
if ( a.size() == b.size() ) {
for ( int i = a.size() - ; i >= ; --i ) {
if ( a[i] != b[i] ) return a[i] > b[i];
}
return ;
}
return a.size() > b.size();
} void make ( int n, string m )
{
if ( n < ) {
ans = "";
return ;
}
if ( pd ( m, fib[n - ] ) ) {
string s1 = sub ( fib[n], "" );
if ( !pd ( m, s1 ) ) {
ans = sub ( m, fib[n - ] );
} else {
ans = sub ( m, fib[n - ] );;
}
return ;
} else make ( n - , m );
} void MOD ( string s, LL k )
{
LL tem = ;
for ( int i = s.size() - ; i >= ; --i ) {
tem = ( tem * + s[i] - '' ) % k;
}
cout << tem << endl;
}
int main()
{
fib[] = "";
fib[] = "";
for ( int i = ; i <= ; ++i ) {
fib[i] = add ( fib[i - ] , fib[i - ] );
}
cin >> T;
while ( T-- ) {
cin >> n >> m;
reverse ( m.begin(), m.end() );
make ( n, m );
MOD ( ans, );
}
}
HDU 5351 MZL's Border (规律,大数)的更多相关文章
- HDU 5351——MZL's Border——————【高精度+找规律】
MZL's Border Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- 多校-HDU 5351 MZL's Border 数学规律
f[1] = 'b', f[2] = 'a', f[i] = f[i - 1] + f[i - 2] 斐波那契数列的字符串,给你n和m,前m位中,最长的前缀等于后缀的长度是多少.1≤n≤1000, 1 ...
- hdu5351 MZL's Border(规律题,java)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud MZL's Border Time Limit: 2000/1000 MS (Ja ...
- 2015 Multi-University Training Contest 5 1009 MZL's Border
MZL's Border Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5351 Mean: 给出一个类似斐波那契数列的字符串序列 ...
- Hdu 5352 MZL's City (多重匹配)
题目链接: Hdu 5352 MZL's City 题目描述: 有n各节点,m个操作.刚开始的时候节点都是相互独立的,一共有三种操作: 1:把所有和x在一个连通块内的未重建过的点全部重建. 2:建立一 ...
- Hdu 5348 MZL's endless loop (dfs)
题目链接: Hdu 5348 MZL's endless loop 题目描述: 给出一个无向图(有环,有重边),包含n个顶点,m条边,问能否给m条边指定方向,使每个顶点都满足abs(出度-入度)< ...
- hdu 5351 规律+大数
题目大意:定义了一种fib字符串,问第n个fib串的前m个字母前后相等串的最大长度,大约就是这样的 其实主要读完题意的时候并没有思路,但是列几个fib字符串就会发现,除了fib1以外,所有串的前面都是 ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- hdu 5349 MZL's simple problem
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5349 MZL's simple problem Description A simple proble ...
随机推荐
- 恢复oracle中误删除drop掉的表
查看回收站中表 select object_name,original_name,partition_name,type,ts_name,createtime,droptime from recycl ...
- How to change pager CSS in CGridView CListView in Yii
类手册: http://www.yiiframework.com/doc/api/1.1/CLinkPager 其它参考: http://capstone3.blogspot.com/2012/06/ ...
- 问题-"Record not found or changed by another user"
回答1:===============================================================问题:clientdataset“Record not found ...
- system partition table
转载内容 摘录部分我的笔记的中doc,和大家一起感受Oracle 11g在分区方面的增强--System Partitioning 系统分区的特点 ●系统分区与其他分区相比,一个最根本的区别就是不需要 ...
- android 获取当前版本号/修改自定义的应用程序的版本号
1.获取当前版本号 PackageManager pm = getPackageManager(); PackageInfo pi = pm.getPackageInfo(getPackageName ...
- PAT 1089. Insert or Merge (25)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- 百度的TSDB——可针对tag查询,应该类似kairosDB
天工架构 目前,天工平台的服务主要由物接入.物解析.物管理.规则引擎和时序数据库组成,并可无缝对接百度云天算智能大数据平台及基础平台产品,可提供千万级设备接入的能力,百万数据点每秒的读写性能,超高的压 ...
- weapon制作武器
weapon制作武器 (weapon.pas/c/cpp) 解题报告 制作武器weapon.pas/c/cpp) 背景 WZland的紧急避难所很快就建好了,WZland的居民们陆续地来到这个紧急避难 ...
- Eclipse + Pydev 配置Python开发环境
之前有人问 Eclipse + Pydev 的环境配置问题,在此记录一下. 前提条件:需要安装 Eclipse .jdk.Python.这三个软件都可以在官网上下载. 假设上述软件已经安装好了,下面是 ...
- heritrix 相关
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...