IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> CF193E Fibonacci Number -> 正文阅读

[C++知识库]CF193E Fibonacci Number

https://www.luogu.com.cn/problem/CF193E

属实是知识盲区了

通过打表不难发现在
1 0 4 10^4 104下循环节是 1.5 × 1 0 4 1.5\times 10^4 1.5×104
1 0 5 10^5 105下循环节是 1.5 × 1 0 5 1.5\times 10^5 1.5×105
1 0 6 10^6 106下循环节是 1.5 × 1 0 6 1.5\times 10^6 1.5×106
1 0 7 10^7 107下循环节是 1.5 × 1 0 7 1.5\times 10^7 1.5×107

以此类推类推,后面 m o d ?? 1 0 i \mod 10^i mod10i循环节是 1.5 × 1 0 i 1.5 \times 10^i 1.5×10i

这相当于是保留了后 i i i

容易得到
如果 f i b ( x ) m o d ?? 1 0 i = n m o d ?? 1 0 i fib(x) \mod 10^i = n \mod 10^i fib(x)mod10i=nmod10i
一定是由 m o d ?? 1 0 i ? 1 \mod 10^{i-1} mod10i?1相等的那批加上 k × k\times k×循环节长度得到的

于是可以先处理 1 0 5 10^5 105以内的,然后往后推即可

code:

#include<bits/stdc++.h>
#define N 2000050
#define ll long long
using namespace std;
ll mod;
// ll mul(ll a, ll b) {
//     ll d = (long double) a / mod * b + 0.5;
//     ll r = a * b - d * mod;
//     return r < 0 ? r + mod : r;
// }
ll mul(ll x, ll y) {
    ll ret = 0; 
    for(; y; y >>= 1ll) {
        if(y & 1) ret = (ret + x) % mod;
        x = (x + x) % mod;
       // printf("%lld %lld\n", x, y);
    }
    //printf("%lld %lld %lld\n", x, y, ret);
    return ret;
}
struct MT {
    ll a[2][2];
    void init() {
        for(int i = 0; i < 2; i ++)
            for(int j = 0; j < 2; j ++) a[i][j] = (i == j);
    }
    MT operator * (const MT& o) const {
        MT c;
        for(int i = 0; i < 2; i ++)
            for(int j = 0; j < 2; j ++) {
                c.a[i][j] = 0;
                for(int  k = 0; k < 2; k ++) 
                    c.a[i][j] = (c.a[i][j] + mul(a[i][k], o.a[k][j]) ) % mod;
            }
        return c;
    }
};
MT qpow(MT x, ll y) {
    MT ret; ret.init(); //ll ha = y;
    //printf("qpow %lld\n", y);
    for(; y; y >>= 1, x = x * x) {
	//	if(ha == 1500000006ll) printf("*%lld*", y);
    	if(y & 1ll) ret = ret * x;
	}
    return ret;
}
ll fib(ll n) { //printf("** %lld\n", n);
    
    if(!n) return 0;
    MT a;
    a.a[0][0] = 0, a.a[0][1] = a.a[1][0] = a.a[1][1] = 1;
	
    a = qpow(a, n - 1);
   // printf("end\n");
    return a.a[1][1];
}  
ll n, a[N], ls[N], f[N];
int gs, vis[N];
int main() {
  //  freopen("b.out","w",stdout);
    scanf("%lld", &n);
    if(!n) {
        printf("0");
        return 0;
    }
    if(n == 1) {
        printf("1");
        return 0;
    }
    mod = 100000;
    f[0] = 0, f[1] = 1;
    if(f[0] % mod == n % mod) a[++ gs] = 0;
    if(f[1] % mod == n % mod) a[++ gs] = 1;
    for(int i = 2; ; i ++) {
        f[i] = (f[i - 1] + f[i - 2]) % mod;
        if(f[i] == 1 && f[i - 1] == 0) break;
        if(f[i] % mod == n % mod) a[++ gs] = i;
    }
    //for(int i = 1; i <= gs; i ++) printf("%lld ", a[i]); printf("\n");
    ll xhj = 150000;
    for(mod = mod * 10; mod <= 10000000000000ll; mod = mod * 10, xhj = xhj * 10) {
        int sz = 0;
         for(int i = 1; i <= gs; i ++) {
             for(int j = 0; j <= 9; j ++) {
                 if(fib(a[i] + j * xhj) == n % mod) {
                     ls[++ sz] = a[i] + j * xhj;
                 }
             }
         }
        gs = sz;
        for(int i = 1; i <= gs; i ++) a[i] = ls[i];
      //  for(int i = 1; i <= gs; i ++) printf("%lld ", a[i]); printf("     %lld\n", mod);
    }
    if(!gs) {
        printf("-1");
        return 0;
    }
    sort(a + 1, a + 1 + gs);
    printf("%lld", a[1]);
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 21:52:22  更:2022-03-17 21:56:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:13:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码