费马小定理
题目大意:给定一个数n,求把n分成1~n个数的方案数。
ans=∑ni=1Cin=2n−1
因为n很大,而
(2,1e9+7)=1
因此可以考虑用费马小定理来降幂。
21e9+6≡1(mod 1e9+7)
所以把幂
mod 1e9+6
,把结果
mod 1e9+7
,快速幂计算即可。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL MOD=1e9+6;
LL n;
inline char readc(){//因为读入时就要模掉,所以干脆写了个读优
static char buf[100000],*l=buf,*r=buf;
if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
if (l==r) return EOF; return *l++;
}
inline LL _read(){
LL num=0; char ch=readc();
if (ch==EOF) return -1;//读到没有了就退出
while (ch<'0'||ch>'9') { ch=readc(); if (ch==EOF) return -1;}
while (ch>='0'&&ch<='9') { num=(num*10+ch-48)%MOD; ch=readc(); }//模掉
return num;
}
LL qsm(LL a,LL b,LL MOD){//快速幂
LL ans=1;
while (b){
if (b&1) ans=(ans*a)%MOD;
b/=2;
a=(a*a)%MOD;
}
return ans;
}
int main(){
freopen("lj.in","r",stdin);
freopen("lj.out","w",stdout);
while (~(n=_read()))
printf("%lld\n",qsm(2,(n-1+MOD)%MOD,MOD+1));
return 0;
}