题意大概是将N拆分成1-n个数,问有多少种组合方法。这个排列组合推一下是S(n) = 2^(n-1)。但由于n非常大,自然想到了快速幂,但发现还是不行,需要用结合费马小定理来解, 费马小定理的公式为: a^(p-1)%p = 1,前提互素这里满足。这样只要求(N-1)%(Mod - 1),然后用快速幂求解即可。
#include<iostream>
#include<string>
#include<algorithm>
#define maxn 100010
using namespace std;
const int mod = 1e9 + 7;
char s[maxn];
long long Mod(char *a, int Mod)
{
long long sum = 0;
for(int i=0; a[i] != '\0'; i++)
{
sum = (sum*10 + a[i] - '0') % Mod;
}
return sum;
}
long long Ksm(long long a, long long k)
{
k = (k+mod) % mod;
long long sum = 1;
while(k)
{
if(k&1)
sum = sum*a%mod;
a = a*a%mod;
k>>=1;
}
return sum;
}
int main()
{
while(~scanf("%s", s))
{
long long n = Mod(s,mod-1) - 1;
printf("%lld\n",Ksm(2,n));
}
return 0;
}