某程序阅读题

Description

一道程序阅读题。如下(稍作修改):

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int g(int k){
    if(k<=1) return k;
    return (2002*g(k-1)+2003*g(k-2))%2005;
}
signed main(){
    scanf("%lld",&n);
    printf("%lld\n",g(n));
    return 0;
}

输入:\(2005\)。求输出。

Solution

Part 1

首先,可以转化为 \(g(x)=(-3g(x-1)-2g(x-2))\%2005\)。我们要找到 \(f(x)=-3g(x-1)-2g(x-2)\) 的通项公式。

通过列举来找规律:\(f(1)=1,f(2)=-3f(1)-2f(0)=-3,f(3)=-3f(2)-2f(1)=9-2=7,f(4)=-15\cdots\)

发现 \(f(1)=2^1-1,f(2)=-(2^2-1),f(3)=2^3-1,f(4)=-(2^4-1)\cdots\)

通项公式:\(f(x)=(-1)^{x-1}(2^x-1)\)

答案应该是:\(g(2005)=(-1)^{2004}\times (2^{2005}-1)\%2005\)
\(=(2^{2005}-1)\% 2005=2^{401\times 5}\% 2005-1\)
\(=(2^{401}\times 2^{401}\times 2^{401}\times 2^{401}\times 2^{401})\% 2005-1\)

Part 2

费马小定理:若 \(m\) 为质数,且 \(\gcd(a,m)=1\),则 \(a^{m−1}\equiv 1\pmod m\)

由于 \(401\) 是质数,且 \(\gcd(2,401)=1\),所以 \(2^{401-1}\equiv 1\pmod {401}\)

\(2\)\(401\) 互质,因为 \(5\)\(2\) 互质,所以:

\(g(2005)=(2^{401}\times 2^{401}\times 2^{401}\times 2^{401}\times 2^{401})\% 2005-1\)
\(=(2\times 2\times 2\times 2\times 2)\% 2005-1\)
\(=31\)

Part 3

这是计算 \(g(2005)=(2^{2005}-1)\% 2005=2^{401\times 5}\% 2005-1\) 的另一种方法。

\(2^4\bmod 5=1\),所以 \(2^{400}\bmod 5=1\)\(2^{401}\bmod 5=2\)

\(2^{401-1}\equiv 1\pmod {401}\),即 \(2^{401-1}\bmod 401=1\),所以 \(2^{401}\bmod 401=2\)

又因为 \(\text{lcm}(5,401)=2005,2^{401}\bmod 2005=2\),所以 \(2^{2005}\bmod 2005-1=2^5-1=31\)

答案: \(31\)。

posted @ 2020-09-30 17:25  jrmyt  阅读(142)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end