容易看出来每次输出的结果为,2的n-1次方对10e9+7取模,但是n太大了,这里利用到了费马小定理:a是整数,p是素数,且gcd(a,p) = 1,则有 a^(p-1) % p = 1 % p = 1.显然这里mod是素数并且与2互质,所以有2^(mod - 1) % mod = 1 % mod = 1,而我们要求的是2^(n-1)%mod,因为2^(mod - 1) % mod = 1,可以得出2^(n-1)%mod = 2^((n-1)%(mod-1))%mod,所以我们只需要求(n-1)%(mod-1),采用大数取模,然后进行快速幂
#include <stdio.h>
#include <string.h>
typedef long long ll;
const ll mod = 1000000000 + 7;
char str[100005];
using namespace std;
ll q_pow(ll a,ll b){
ll r = 1,base = a;
while(b){
if(b & 1){
r = (r * base) % mod;
}
base = (base * base) % mod;
b >>= 1;
}
return r;
}
int main(void){
while(scanf("%s",str) != EOF){
ll num = 0;
int len = strlen(str);
for(int i = 0; i < len; i++){
num = (num * 10 + str[i] - '0') % (mod - 1);
num %= (mod - 1);
}
//应该求的是(n-1)对(mod-1)取模,注意这里要处理一下
if(num == 0){
printf("%lld\n",q_pow(2,mod - 2));
}
else{
num--;
printf("%lld\n",q_pow(2,num));
}
}
return 0;
}