[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 (规律,大数)的更多相关文章

  1. HDU 5351——MZL's Border——————【高精度+找规律】

    MZL's Border Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  2. 多校-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 ...

  3. hdu5351 MZL's Border(规律题,java)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud MZL's Border Time Limit: 2000/1000 MS (Ja ...

  4. 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: 给出一个类似斐波那契数列的字符串序列 ...

  5. Hdu 5352 MZL's City (多重匹配)

    题目链接: Hdu 5352 MZL's City 题目描述: 有n各节点,m个操作.刚开始的时候节点都是相互独立的,一共有三种操作: 1:把所有和x在一个连通块内的未重建过的点全部重建. 2:建立一 ...

  6. Hdu 5348 MZL's endless loop (dfs)

    题目链接: Hdu 5348 MZL's endless loop 题目描述: 给出一个无向图(有环,有重边),包含n个顶点,m条边,问能否给m条边指定方向,使每个顶点都满足abs(出度-入度)< ...

  7. hdu 5351 规律+大数

    题目大意:定义了一种fib字符串,问第n个fib串的前m个字母前后相等串的最大长度,大约就是这样的 其实主要读完题意的时候并没有思路,但是列几个fib字符串就会发现,除了fib1以外,所有串的前面都是 ...

  8. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  9. hdu 5349 MZL's simple problem

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5349 MZL's simple problem Description A simple proble ...

随机推荐

  1. 使用Hadoop打造私有云盘之API操作

    项目介绍:使用hadoop实现云盘的增删读获取列表功能,hadoop不支持数据修改,特性是一次写入多次读取.主流的网盘也不支持该功能.今天我们用hdfs的FileSystem实现这些操作. 1.上传功 ...

  2. MSSQL 多个表关联更新

    正确写法2):UPDATE A  SET A.mobilephone = b.mobile FROM tb_contact A,tmp_contact b WHERE A.contact_name = ...

  3. devexpress中gridcontrol头部添加垂直线(右边框)

    winform开发,用devexpress中的gridcontrol控件,头部默认是3D样式,当客户希望像内容一样扁平化显示且需要添加垂直线(右边框)时恶梦开始了..经过一阵摸索发现可以这样解决: 1 ...

  4. IOS Label 自动换行 IOS6和IOS7

    IOS 6和ios7 不一样,所以,我们分开来: IOS6: //计算实际frame大小,并将label的frame变成实际大小     CGSize size01 = [ssizeWithFont: ...

  5. 开启、关闭数据库mysql

    1.命令行 net start mysql net start mysql 2.点控制面板→管理→服务 招到mysql 3.找到安装目录下的bin目录

  6. Android开发之位置定位详解与实例解析(GPS定位、Google网络定位,BaiduLBS(SDK)定位)

    在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便.定位一般分为三种发方案:即GPS定位.Google网络定位以及基站定位 最简单的手机定位方式当然是通过GP ...

  7. 观察者模式Demo

    using System; using System.Collections.Generic; namespace Demo {     #region 抽象层,定义了观察者模式     /// &l ...

  8. H5上传文件

    XMLHttpRequest 在Html5 规范中已经有全新的变化,规定了XMLHttpRequest Level 2规范(目前最新版本)包含下列新的特性: 处理字节流,例如作为上传或者下载的File ...

  9. Clean Code(三):注释

    在工作中经常在刚开始写代码的时候,写下类与方法的注释,时间久了,CR多了,也不可能一直去修改注释了.加班都累成dog.注释才不改呢,就是这么任性,哈哈. 项目久了,注释会欺骗阅读者,本人被骗过,也骗过 ...

  10. Android 頁面中有 EditText ,進入時取消自動彈出鍵盤

    Android 畫面裡的 EditText 被 Focus 時 會自動彈出鍵盤 這是方便使用者習慣的設計 不過筆者在開發時發現 有時候方便過頭了 原因 一開始進入有 EditText 的頁面時 Edi ...