luoguP4000 斐波那契数列
题目链接
题解
根据这个东西
https://www.cnblogs.com/sssy/p/9418732.html
我们可以找出%p意义下的循环节
然后就可以做了
人傻,自带,大,常数
代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL maxn = 1000007;
LL dp[maxn * 10];
LL prime[maxn],s = 0;
bool vis[maxn];
void init_prime() {
    for(LL i = 2;i < maxn;i ++) {
        if(!vis[i]) prime[s ++] = i;
        for(LL j = 0;j < s && i * prime[j] < maxn;j ++) {
            vis[i * prime[j]] = 1;
            if(i%prime[j] == 0) break;
        }
    }
}
LL pow_mod(LL a1,LL b1){
    LL ret = 1;
    for(;b1;b1 >>= 1,a1 *= a1)
        if(b1 & 1) ret = ret * a1;
    return ret;
}
LL pow_mod2(LL a,LL b,LL p) {
    LL ret = 1;
    for(;b;b >>= 1,a = a * a % p)
        if(b & 1) ret = ret * a % p;
    return ret;
}
LL gcd(LL a,LL b) { return b ? gcd(b,a % b) : a; }
bool f(LL n,LL p) {
    if(pow_mod2(n,(p - 1) >> 1,p) != 1) return false;
    return true;
}
struct matrix{
    LL x1,x2,x3,x4;
};
matrix matrix_a,matrix_b;
matrix M2(matrix aa,matrix bb,LL mod){
    matrix tmp;
    tmp.x1 = (aa.x1 * bb.x1 % mod + aa.x2 * bb.x3 % mod) % mod;
    tmp.x2 = (aa.x1 * bb.x2 % mod + aa.x2 * bb.x4 % mod) % mod;
    tmp.x3 = (aa.x3 * bb.x1 % mod + aa.x4 * bb.x3 % mod) % mod;
    tmp.x4 = (aa.x3 * bb.x2 % mod + aa.x4 * bb.x4 % mod) % mod;
    return tmp;
}
matrix M(LL n,LL mod){
    matrix a,b;
    a=matrix_a;b=matrix_b;
    for(;n;n >>= 1,a = M2(a,a,mod))
        if(n & 1) b = M2(b,a,mod);
    return b;
}
LL fac[100][2],l,x,fs[1000];
void dfs(LL count,LL step) {
    if(step == l) {
        fs[x ++] = count;
        return ;
    }
    LL sum = 1;
    for(LL i = 0;i < fac[step][1];++ i) {
        sum *= fac[step][0];
        dfs(count * sum,step + 1);
    }
    dfs(count,step + 1);
}
LL solve2(LL p){
    if(p < 1e6 && dp[p])   return dp[p];
    bool ok = f(5,p);//判断5是否为p的二次剩余
    LL t;
    if(ok) t = p - 1;
    else t = 2 * p + 2;
    l = 0;
    for(LL i = 0;i < s;i ++){
        if(prime[i] > t / prime[i])  break;
        if(t % prime[i] == 0) {
            LL count = 0;
            fac[l][0] = prime[i];
            while(t % prime[i] == 0) count ++ , t /= prime[i];
            fac[l ++][1] = count;
        }
    }
    if(t > 1) fac[l][0]=t, fac[l++][1]=1;
    x = 0;
    dfs(1 , 0); //求t的因子
    sort(fs,fs + x);
    for(LL i = 0;i < x;i ++) {
        matrix m1 = M(fs[i],p);
        if(m1.x1 == m1.x4 && m1.x1 == 1 && m1.x2 == m1.x3 && m1.x2 == 0) {
            if(p < 1e6) dp[p] = fs[i];
            return fs[i];
        }
    }
}
LL get_M(LL n){
    LL ans = 1,cnt;
    for(LL i = 0;i < s;i ++) {
        if(prime[i] > n / prime[i]) break;
        if(n % prime[i] == 0) {
             LL count = 0;
            while(n % prime[i] == 0)  count ++,n /= prime[i];
            cnt = pow_mod(prime[i],count - 1);
            cnt *= solve2(prime[i]);
            ans = (ans / gcd(ans , cnt)) * cnt;
        }
    }
    if(n > 1){
        cnt = 1;
        cnt *= solve2(n);
        ans = ans / gcd(ans,cnt) * cnt;
    }
    return ans;
}
char Ss[30000007];
struct bign {
    int z[30000007],l;
    void init() {
 		memset(z,0,sizeof(z));
        scanf("%s",Ss + 1);
        l = strlen(Ss + 1);
        for(int i = 1;i <= l;i ++)
            z[i] = Ss[l - i + 1] - '0';
    }
    LL operator % (const long long & a) const {
        LL b = 0;
        for (int i = l;i >= 1;i --)
            b = (b * 10 + z[i]) % a;
        return b;
    }
}z;
LL m1;
struct Matrix {
    LL a[3][3];
    Matrix () { memset(a,0,sizeof a); }
    Matrix  operator * (const Matrix & p) const {
        Matrix ret;
        for(int i = 0;i <= 1;++ i)
            for(int j = 0;j <= 1;++ j)
                for(int k = 0;k <= 1;++ k)
                    ret.a[i][j] = (ret.a[i][j] + ( a[i][k] * p.a[k][j] ) % m1 ) % m1;
        return ret;
    }
};
LL solve(LL x) {
    Matrix p,q;
    p.a[0][0] = 1; p.a[0][1] = 1; p.a[1][0] = 1;
    q.a[0][1] = 1;
    for(;x;x >>= 1,p = p * p)
        if(x & 1) q = q * p;
    return q.a[0][0];
}
main() {
    LL t,n;
    init_prime();
    matrix_a.x1 = matrix_a.x2 = matrix_a.x3 = 1;
    matrix_a.x4 = 0;
    matrix_b.x1 = matrix_b.x4 = 1;
    matrix_b.x2 = matrix_b.x3 = 0;
    dp[2] = 3;dp[3] = 8;dp[5] = 20;
    z.init(); scanf("%lld",&n); m1 = n;
    n = get_M(n);
    //printf("%lld\n",n % m1);
    n = z % n;
    printf("%lld\n",solve(n));
    return 0;
}
luoguP4000 斐波那契数列的更多相关文章
- C#求斐波那契数列第30项的值(递归和非递归)
		using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ... 
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
		对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ... 
- js中的斐波那契数列法
		//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ... 
- 剑指Offer面试题:8.斐波那契数列
		一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ... 
- 算法: 斐波那契数列C/C++实现
		斐波那契数列: 1,1,2,3,5,8,13,21,34,.... //求斐波那契数列第n项的值 //1,1,2,3,5,8,13,21,34... //1.递归: //缺点:当n过大时,递归 ... 
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
		P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ... 
- Python递归及斐波那契数列
		递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ... 
- 简单Java算法程序实现!斐波那契数列函数~
		java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ... 
- js 斐波那契数列(兔子问题)
		对于JS初学者来说,斐波那契数列一直是个头疼的问题,总是理不清思路. 希望看完这篇文章之后会对你有帮助. 什么是斐波那契数列 : 答: 斐波那契数列,又称黄金分割数列.因数学家列昂纳多·斐波那契(Le ... 
随机推荐
- 2018年9月28日CCPC秦皇岛站参赛总结
			day1: 被中间结果超出int范围给叉了,立刻意识到了自己的弱小以及校赛出题的时候是怎么叉别人的 day2: 签到签了40分钟,谨慎一些还是很好的,机子重启耽误了一些时间 一道暴力+LCS的简单题被 ... 
- 20155319 2016-2017-2 《Java程序设计》第5周学习总结
			20155319 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 8 异常处理 - `try`和`catch`语法,如果被try{}的语句出现了catch() ... 
- ASP.NET程序发布
			详细流程请参考文章:https://www.cnblogs.com/wangjiming/p/6286045.html 主要补充个人操作过程中遇到的问题: 1)网站发布完成后,站点下没有aspnet_ ... 
- Linux下USB转串口的驱动【转】
			转自:http://www.linuxidc.com/Linux/2011-02/32218.htm Linux发行版自带usb to serial驱动,以模块方式编译驱动,在内核源代码目录下运行Ma ... 
- Mysql读写分离-Amoeba Proxy
			参考:http://www.linuxidc.com/Linux/2015-10/124115.htm 一个完整的MySQL读写分离环境包括以下几个部分: 应用程序client database pr ... 
- Gentoo rc-update service ‘net.eth0′ does not exist
			最近迷上了Gentoo,并相信以后也会把更多的精力放在Gentoo上,不过Gentoo的安装的过程的确让很多人却步. 本文只提到添加net.eth0到默认的运行级别时一个很小的报错解决. # nano ... 
- Java8系列之重新认识HashMap
			转自: http://www.importnew.com/20386.html 简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是Ha ... 
- docker 要点学习
			本文主要记录学习和使用docker时遇到的一些问题和踩过的坑 1.本地docker新建redis容器,映射6379端口到本地,本机的java项目再去连,会一直连不上,原因是redis容器中映射端口时需 ... 
- node.js开发web
			1.安装express框架 使用npm install -g express安装express后,在命令行中执行express,提示没有此命令 原因是在新版的express中命令行需要单独安装 npm ... 
- 浅谈js设计模式之代理模式
			代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景.比如,明星都有经纪人作为代理.如果想请明星来办一场商业演出,只能联系他的经纪人.经纪人会把商业演出的细节和报酬都谈好之后,再把合同交 ... 
