【NOIP模拟赛】一道挖掉背景的数学题

Title:【Empty】

Time Limit:1000 ms

Memory Limit:131072 KBytes

Description

给定n与p,求\(\left\lfloor x^n\right\rfloor \% p\),x=\(\frac{\sqrt{5}+1}{2}\)

Input Format

输入一行,两个非负整数n,p。

Output Format

输出一个整数,表示答案

Sample Input

5 97

Sample Output

11

Solution

今天写道数学题吧OwO

这道题我们看到\(\frac{{\sqrt 5 {\rm{ + }}1}}{2}\),那么我们容易想到另一个无理数\(\frac{1-\sqrt 5}{2}\)对吧?

因为这两个无理数是方程\(t^2-t-1=0\)的两根

那么数学好的大佬肯定一眼看出这个特征方程对应的递推通式是\(f[i]=f[i-1]+f[i-2]\)

我们首先设\(x1=\frac{{\sqrt 5 {\rm{ + }}1}}{2}\)\(x2=\frac{1-\sqrt 5}{2}\)

那么其实这个递推式的通式其实就是\(f[n]=c1*x1^n+c2*x2^n\)

具体这个递推式是什么呢?我们并不在乎对吧(引用:我又不是数学老师)

为了得到\(x1^n\),我们不妨假设这个递推式的通项式为\(f[n]=(\frac{{\sqrt 5 {\rm{ + }}1}}{2})^n+(\frac{1-\sqrt 5}{2})^n\)

首先我们将0,1带入递推通式得到\(f_0=2,f_1=1\),那么我们所得到的递推式每一项都必然是一个整数

由于\(-1<\frac{1-\sqrt 5}{2}<0\),显然\(\begin{cases} -1<(\frac{1-\sqrt 5}{2})^n<0& \text{n%2==1} \\ 0<(\frac{1-\sqrt 5}{2})^n<1& \text{n%2==0} \end{cases}\)

那么我们只要对于n的奇偶性讨论一下,如果是奇就直接输出\(f[n]\),否则输出\(f[n]-1\)

剩下就是一个矩阵乘法求递推第n项,因此很容易求解

#include
long long n;
int zqm,f0,f1;
struct r{
    int a,b,c,d;
}a,c;
r operator *(r a,r b){
    r c;
    c.a=(a.a*1ll*b.a+a.b*1ll*b.c)%zqm;
    c.b=(a.a*1ll*b.b+a.b*1ll*b.d)%zqm;
    c.c=(a.c*1ll*b.a+a.d*1ll*b.c)%zqm;
    c.d=(a.c*1ll*b.b+a.d*1ll*b.d)%zqm;
    return c;
}
int main()
{
    scanf("%lld%d",&n,&zqm);
    f0=2,f1=1;
    if (n==0){
        printf("%d\n",1%zqm);
        return 0;
    }
    if (n==1){
        printf("%d\n",1%zqm);
        return 0;
    }
    n-=2;
    int ans=0;
    if (!(n&1)) ans--;
    a=(r){1,1,1,0};
    c=a;
    while (n){
        if ((n&1)) c=c*a;
        a=a*a,n>>=1;
    }
    ans=(c.a*1ll*f1+f0*1ll*c.b+ans)%zqm;
    printf("%d",ans);
    return 0;
}

转载于:https://www.cnblogs.com/Cool-Angel/p/7800948.html

你可能感兴趣的:(【NOIP模拟赛】一道挖掉背景的数学题)