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. 【UE4 C++】UGameplayStatics 源代码

    // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" # ...

  2. spring social实现百度登录

    在早期我写过一篇spring social理解的文章,介绍了一些spring social的概念,但是没有提供一个例子.在这篇博客中,提供一个简单的spring social的例子,实现 百度登录,那 ...

  3. Docker制作能够ssh连接的镜像

    本类文章只作为记录使用 命令操作: #拉取Centos 7 docker pull centos:7 #运行一个镜像 docker run -tdi --privileged centos:7 ini ...

  4. 数位dp & 热身训练7

    数位dp 数位dp是一种计数用的dp,一般就是要统计一段区间$[L,R]$内,满足一定条件的数的个数,或者各个数位的个数. 数位dp使得暴力枚举变为满足一定状态的记忆化,更加优秀. 数位dp常常会考虑 ...

  5. 关于下载pyton第三方库的细节

    1.下载Python第三方库有时候国外的网站网速很不好,需要选择国内的镜像网站去下载 阿里云 http://mirrors.aliyun.com/pypi/simple   中国科技大学 https: ...

  6. 摘录:ddr3内存条时序概念

    本文摘自:内存系列二:深入理解硬件原理 - 知乎 (zhihu.com),感谢作者! 上次虽然解决了小张的问题,却引发了他对内存原理的兴趣.这不他又来找我了,说我还欠他一个解释.这次我们约在一个咖啡馆 ...

  7. python re:正则表达式中使用变量

    参考:https://www.cnblogs.com/songbiao/p/12422632.html Python中正则表达式的写法,核心就是一个字符串.如下:re.compile(r'表达式')所 ...

  8. 最接近的数 牛客网 程序员面试金典 C++ Python

    最接近的数 牛客网 程序员面试金典 C++ Python 题目描述 有一个正整数,请找出其二进制表示中1的个数相同.且大小最接近的那两个数.(一个略大,一个略小) 给定正整数int x,请返回一个ve ...

  9. hdu 2159 FATE(DP)

    题意: 小余玩游戏,离最后一级还需n的经验值,但是他已经很厌烦了,还剩下m的忍耐度.每杀一只怪小余会得到相应的经验,同时减掉相应的忍耐度. 当忍耐度降到0或者0以下时,小余就不会再玩这个游戏.小余还说 ...

  10. 记一次 php-fpm 连接 nginx 的错误。

    环境: docker 中 centos 镜像下 yum 安装的php,nginx. [root@lnmp1 /]# php -v PHP 7.2.11 (cli) (built: Oct 9 2018 ...