#include <iostream>
using namespace std;
const long long MOD = 1000000007;
long long fast_pow(long long base, long long exp, long long mod) {
long long res = 1;
base %= mod;
while (exp) {
if (exp & 1) res = (res * base) % mod;
base = (base * base) % mod;
exp >>= 1;
}
return res;
}
int main() {
long long n;
cin >> n;
if (n == 2) {
cout << 0 << endl;
} else {
long long ans = (fast_pow(2, n, MOD) - 2;
if (ans < 0) ans += MOD; // 确保非负
cout << ans % MOD << endl;
}
return 0;
}
而(2^n - 2)mod MOD 可以写成 ( (2^n mod MOD) - 2 ) % MOD,但这样可能是负数,所以我们加上MOD再取模:
ans = ( (2^n mod MOD - 2) + MOD ) % MOD;
这样,当(2^n % MOD) >=2时,就是(2^n % MOD - 2);当(2^n % MOD) <2时(即等于0或1),那么加上MOD再减2,然后模MOD。
但是,我们之前已经说明,模后r是偶数,且r>=0,且r不等于0(因为2^n不能被MOD整除),所以r>=2?不一定,比如r=0不可能,但r=2,4,...。但r=0不可能,那么r最小可能是2吗?可能,比如当2^n mod MOD=2时,那么(2^n-2) mod MOD=0。所以我们需要这样处理。
所以,代码中:
long long a = fast_pow(2, n, MOD);
long long ans = (a - 2) % MOD;
if (ans < 0) ans += MOD;
// 或者直接:ans = (a - 2 + MOD) % MOD;
但考虑到a>=0,a-2可能为负(当a=0或1时),但a=0或1的情况在n>=3时不会出现?因为2^n>=8,模MOD后最小为2?不对,模后可能为0(但我们已经排除0,因为MOD不整除2^n)?不对,模后为0的情况不存在(因为MOD是素数且大于2,所以2^n mod MOD=0当且仅当2^n是MOD的倍数,而2^n的因子只有2,MOD是大于2的素数,所以不可能)。所以模后最小为2?也不一定,比如2^3=8,模7等于1(但7不是MOD,MOD是10^9+7)。实际上,模后可能是任意偶数(包括小于2的?不可能,因为模后最小为0,但0不存在,所以最小是2?不一定,比如模后可能是4,6,...,但2^n mod MOD=2的情况:例如,2^n=2 (mod MOD) 当且仅当2^n-2是MOD的倍数。所以我们需要考虑。
因此,为了安全,我们使用:
ans = (a - 2 + MOD) % MOD;
这样,如果a-2是负数,加上MOD就变成正数,然后模MOD就是正确结果。
所以,最终代码:
if (n == 2) {
cout << 0 << endl;
} else {
long long a = fast_pow(2, n, MOD);
long long ans = (a - 2 + MOD) % MOD;
cout << ans << endl;
}
但是,我们考虑n=3:a=8 mod (10^9+7)=8,ans=(8-2+10^9+7)%(10^9+7)=6,正确。
所以,我们这样写。
注意:当n很大时,快速幂能够高效计算2^n mod MOD。
因此,代码实现如下:
#include <iostream>
using namespace std;
const long long MOD = 1000000007;
long long fast_pow(long long base, long long exp, long long mod) {
long long result = 1;
base %= mod;
while (exp > 0) {
if (exp & 1)
result = (result * base) % mod;
base = (base * base) % mod;
exp >>= 1;
}
return result;
}
int main() {
long long n;
cin >> n;
if (n == 2) {
cout << 0 << endl;
return 0;
}
long long a = fast_pow(2, n, MOD);
long long ans = (a - 2 + MOD) % MOD;
cout << ans << endl;
return 0;
}```