Codeforces 题目传送门 & 洛谷题目传送门

蠢蠢的我竟然第一眼想套通项公式?然鹅显然 \(5\) 在 \(\bmod 10^{13}\) 意义下并没有二次剩余……我真是活回去了。。。

考虑打表找规律(u1s1 这是一个非常有用的技巧,因为这个 \(10^{13}\) 给的就很灵性,用到类似的技巧的题目还有这个,通过对这些模数的循环节打表找出它们的共同性质,所以以后看到什么特殊的数据或者数据范围特别大但读入量 \(\mathcal O(1)\) 的题(比如 CF838D)可以考虑小数据打几个表看看有没有什么共同特征,说不定对解题有些用处),斐波那契数列在模 \(10,100,1000,10000,100000,\cdots\) 意义下的循环节恰好是 \(60,300,1500,15000,150000\),后面依次乘 \(10\)。

因此我们考虑这样一个算法,我们考虑枚举 \(f_1,f_2,\cdots,f_{1.5\times 10^6}\),即 Fibonacci 数列在模 \(10^6\) 下的循环节并求出满足 \(f_i\equiv n\pmod{10^6}\) 的 \(i\) 组成的集合 \(S\),然后一步步将模数乘 \(10\) 并生成新的集合 \(S\),具体来说,由于每 \(1.5\times 10^6\) 项斐波那契数列恰好构成一个循环节,因此斐波那契数列模 \(10^7\) 的一个循环节恰好由 \(10\) 个模 \(10^6\) 的循环节组成,因此在一个模 \(10^7\) 的循环节中,所有 \(f_i\) 与 \(n\) 模 \(10^6\) 同余的 \(i\) 一定可以写成 \(kT+x\) 的形式,其中 \(k=0,1,2,\cdots,9,T=1.5\times 10^6,x\in S\),我们只需检验是否 \(f_{kT+x}\equiv n\pmod{10^7}\) 即可求出 \(f_i\equiv n\pmod{10^7}\) 的 \(i\) 组成的集合 \(S\),也就完成了由 \(10^6\to 10^7\) 的转化,如此一直推到 \(10^{13}\) 即可。

时间复杂度 \(\mathcal O(\text{能过})\)

const int T=1.5e6;
const ll MOD=1e13;
const int SMOD=1e6;
const ll INF=1e18;
ll n;
ll smul(ll x,ll y){
ll ret=0;
for(;y;y>>=1,(x<<=1)%=MOD) if(y&1) (ret+=x)%=MOD;
return ret;
}
struct mat{
ll a[2][2];
mat(){memset(a,0,sizeof(a));}
mat operator *(const mat &rhs){
mat ret;
for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++)
ret.a[i][j]+=smul(a[i][k],rhs.a[k][j]);
for(int i=0;i<2;i++) for(int j=0;j<2;j++) ret.a[i][j]%=MOD;
return ret;
}
};
ll getf(ll ps){
mat bs;bs.a[0][1]=bs.a[1][0]=bs.a[1][1]=1;
mat rs;rs.a[0][0]=rs.a[1][1]=1;
for(;ps;ps>>=1,bs=bs*bs) if(ps&1) rs=rs*bs;
return rs.a[1][0];
}
vector<ll> can,tmp;
int main(){
scanf("%lld",&n);
for(ll i=1,p=0,q=1;i<=T;i++){
if(q%SMOD==n%SMOD) can.pb(i);
p=(p+q)%MOD;p^=q^=p^=q;
} ll CT=T,CMOD=SMOD;
while(CMOD^MOD){
tmp.clear();CMOD*=10;
for(ll x:can) for(int i=0;i<=9;i++)
if(getf(CT*i+x)%CMOD==n%CMOD) tmp.pb(CT*i+x);
swap(tmp,can);CT*=10;
} ll res=INF;for(ll x:can) chkmin(res,x);
printf("%lld\n",(res==INF)?-1:res);
return 0;
}

Codeforces 193E - Fibonacci Number(打表找规律+乱搞)的更多相关文章

  1. codeforces Gym 100418D BOPC 打表找规律,求逆元

    BOPCTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action?c ...

  2. ZOJ 3622 Magic Number 打表找规律

    A - Magic Number Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Subm ...

  3. [CQOI2014]数三角形 题解(找规律乱搞)

    题面 其实这道题不用组合数!不用容斥! 只需要一个gcd和无脑找规律(滑稽 乍一看题目,如果单纯求合法三角形的话情况太多太复杂,我们可以从局部入手,最终扩展到整体. 首先考虑这样的情况: 类似地,我们 ...

  4. CodeForces - 1110C-Meaningless Operation(打表找规律)

    Can the greatest common divisor and bitwise operations have anything in common? It is time to answer ...

  5. Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)

    题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...

  6. Codeforces Round #493 (Div. 2)D. Roman Digits 第一道打表找规律题目

    D. Roman Digits time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. HDU 1021 Fibonacci Again【打表找规律】

    Fibonacci Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. codeforces#1090 D. New Year and the Permutation Concatenation(打表找规律)

    题意:给出一个n,生成n的所有全排列,将他们按顺序前后拼接在一起组成一个新的序列,问有多少个长度为n的连续的子序列和为(n+1)*n/2 题解:由于只有一个输入,第一感觉就是打表找规律,虽然表打出来了 ...

  9. Codeforces Beta Round #24 D. Broken robot (打表找规律)

    题目链接: 点击我打开链接 题目大意: 给你 \(n,j\),再给出 \(m[0]\) 的坐标和\(a[0]-a[n-1]\) 的坐标. 让你输出 \(m[j]\) 的坐标,其中 \(m[i]\) 和 ...

随机推荐

  1. 【c++ Prime 学习笔记】第9章 顺序容器

    一个容器是特定类型对象的集合 顺序容器中元素的顺序与其加入容器的位置对应 关联容器中元素的顺序由其关联的关键字决定,关联容器分为有序关联容器和无序关联容器 所有容器类共享公有接口,不同容器按不同方式扩 ...

  2. elasticsearch使用ik中文分词器

    elasticsearch使用ik中文分词器 一.背景 二.安装 ik 分词器 1.从 github 上找到和本次 es 版本匹配上的 分词器 2.使用 es 自带的插件管理 elasticsearc ...

  3. Python课程笔记(九)

    本次课程主要学习了Excel和JSON格式的一些读写操作.课程代码 一.Excel数据读写操作 1.安装模块 pip install xlrd pip install xlwt 网不好可以采用三方库: ...

  4. linked-list-cycle leetcode C++

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  5. Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) Editorial题解

    A 略,发现只有当末尾为9时才满足条件.. B 简单模拟,注意数组大小!!! C 简单模拟. D 比较暴力的一个做法就是每次找一个开始匹配的起始点,然后每次不同时向后跳2就行了. 注意这里最后还要判断 ...

  6. hdu 2058 The sum problem(简单因式分解,,)

    Problem Description Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-se ...

  7. Spring Cloud Alibaba环境搭建

    前言:Spring Cloud Alibaba是目前主流的分布式微服务架构,本文主要讲解了在IDEA中如何搭建Spring Cloud Alibaba环境,以及介绍Spring Cloud Aliba ...

  8. 安装配置多个版本JDK

    前言:JDK有多个版本,有时为了开发需要切换不同的版本,在一部电脑上安装多个JDK,只需要按以下配置,每次即可轻松使用.以下环境为Windows10 安装JDK 安装JDK8 配置环境变量 需要配置J ...

  9. $.ajax、$.get和$.post方法成功,完成请求,错误或失败的回调

    一.$.get和$.post的不同    1.get通过url提交的,post是通过http消息实体提交的    2.get提交大小限制为2kb,post不限制    3.get提交会被缓存下来,有安 ...

  10. no space left on device 磁盘空间不足

    新挂载的目录,创建文件提示:no space left on device 1.执行命令:df -h ,查看盘是否挂载成功 2.用history命令查看历史命令,尴尬的发现挂载前忘记格式化了 3.取消 ...