[HDU] Fibonacci Check-up

这是链接

结论破题,浪费了我三张纸,结论居然只和斐波那契数列有关,有趣

推导过程太多不写了qwq,虽然推导很简单,但是有个坑点,很难想到将 $ S_i $ 最终化为 $ F_i $ 表示。

结论是 \[ S_i = F_{n*2} \]

所以这道题我们只需要求斐波那契数就行了,是不是很简单啊qwq。


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;
typedef long long ll;
const int N = 5;

ll Mod;

struct matrix{
    ll M[N][N];
    int l,r;

    void operator * (matrix x){
        int i,j,k; matrix t;
        for(i=1;i<=l;i++)
            for(j=1;j<=r;j++)
                t.M[i][j]=0;
        for(i=1;i<=r;i++)
            for(j=1;j<=x.l;j++)
                for(k=1;k<=l;k++)
                    t.M[j][i] = (t.M[j][i] + M[k][i] * x.M[j][k]) %  Mod;
        for(i=1;i<=l;i++)
            for(j=1;j<=r;j++)
                M[i][j]=t.M[i][j];
    }
}res,a,c,ans;

int main(){
    int i,j,T,cnt;ll n;
    res.l=2; res.r=1;
    a.l=a.r=2;
    a.M[1][1]=a.M[1][2]=a.M[2][1]=1; a.M[2][2]=0;
    res.M[1][1]=1; res.M[1][2]=0;
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld",&n,&Mod);
        if(n==0){
            printf("0\n");
            continue;
        }
        ans=res;
        c=a;
        n*=2; n-=1;
        for(; n ; n >>= 1){
            if(n & 1) ans * c;
            c * c;
        }
        printf("%lld\n",ans.M[1][1]);
    }
    return 0;
}
时间: 2024-10-06 16:41:29

[HDU] Fibonacci Check-up的相关文章

hdu 2888 Check Corners(RMQ)

题目链接:hdu 2888 Check Corners 题目大意:给定一个矩阵,每次查询矩阵中的最大值,并且判断该最大值是否在所查询的角落上. 解题思路:一开始用线段树,一维RMQ都超时了,然后换成了二维的RMQ,结果MLE,dp数组换成9?9就过了. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 305; int N, M,

HDU Fibonacci Again

Fibonacci Again Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 39   Accepted Submission(s) : 31 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description There are another kin

hdu 2888 Check Corners

/* 题意:给出m,n代表给出长为m宽为n的矩阵,然后给出一个q代表查询的次数,然后q行每行给出一个 r1, c1, r2, c2 且满足(1 <= r1 <= r2 <= m, 1 <= c1 <= c2 <= n) 输出这个矩形范围内的最大值,如果最大值是四个顶点某一个的话就输出yes否则输出no */ #include<stdio.h> #include<math.h> #define Max(a,b) a>b?a:b int dp[

RMQ(Range MinimumQuery)问题

RMQ(Range MinimumQuery)问题 有关RMQ的详细介绍可见刘汝佳<算法竞赛入门经典训练指南>P197页 RMQ问题可以解决对于一个整数数组(当然也可以是其他可比较大小的元素类型)的任意区间[L, R]查询最值时,以O(1)时间复杂度回答询问.其实它就是一种数据压缩的思想. RMQ能在经过O(nlogn)的时间预处理后,做到O(1)时间复杂度的任意区间最大最小值查询. 下面是一维RMQ代码: #include<cstdio> #include<cstring&

HDU 5018 Revenge of Fibonacci(数学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5018 Problem Description In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation Fn = Fn-1 + Fn-2 with seed values F1 = 1; F2 = 1 (sequence A000045 in OEIS). ---

hdu 5167 Fibonacci(DFS)

hdu 5167 Fibonacci 问题描述 斐波那契数列的递归定义如下: Fi=???01Fi?1+Fi?2i = 0i = 1i > 1 现在我们需要判断一个数是否能表示为斐波那契数列中的数的乘积. 输入描述 有多组数据,第一行为数据组数T(T≤100,000). 对于每组数据有一个整数n,表示要判断的数字. 0≤n≤1,000,000,000 输出描述 对于每组数据,如果可以输出"Yes",否则输出"No". 输入样例 3 4 17 233 输出样例

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

BestCoder10 1001 Revenge of Fibonacci(hdu 5018) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5018 题目意思:给出在 new Fibonacci 中最先的两个数 A 和 B(也就是f[1] = A, f[2] = B),通过这条式子f[n] = f[n-1] + f[n-2],问 C 是否在这条 new Fibonacci sequence 内.(1 <= A, B, C <= 1 000 000 000) 首先,要想到 C 有可能是 A 或者 B,这种情况也是属于在这个序列范围内的. 还

矩阵十题【三】 HDU 1588 Gauss Fibonacci

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1588 题目大意:先要知道一组斐波那契数列 i 0 1 2 3 4 5 6 7 f(i) 0 1 1 2 3 5 8 13 下面给你一组数: k,b,n,M 现在知道一组公式g(i)=k*i+b:(i=0,1,2,3...n-1) 让你求出 f(g(i)) 的总和(i=01,2,3,...,n-1),比如给出的数据是2 1 4 100 2*0+1=1   f(1)=1 2*1+1=3   f(3)=2