某程序阅读题
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\)。