题目:
分析与解答:
参考思路: 
 https://www.cnblogs.com/stepping/p/7144512.html 
 https://blog.csdn.net/strangedbly/article/details/50996908 
 根据隔板定理,把N分成一份的分法数为C(1,n-1), 
 把N分成两份的分法数为C(2,n-1), 
 把N分成三份的分法数为C(3,n-1),…. , 
 把N分成N份的分法数为C(n-1,n-1)。 
 设sum=S(1)+S(2)+…+S(N),根据组合数求和公式,sum=2^(n-1)。 
 原式可化为(2^(N-1))mod(10^9+7) 
 但是现在n太大了,需要考虑简化。
对于(a^N)mod(p) 
 使用费马小定理的前提条件是 
 p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p) 
 费马小定理降幂例子: 
 p=7 
 求(2^32)%p 
 由费马小定理(2^6)%p=1 
 所以((2^6)^k)%p=1 (k=1.2.。。。n) 
 (2^32)%p=(2^[(6*5)+2])%p 
 =[2^(6*5)*2^2]%p 
 =[(2^(6*5)%p)(2^2%p)]%p //(a*b)%m=[(a%m)(b%m)]%m; 
 =[1*(2^2%p)]%p //2^(6*5)%p为对费马小定理的应用 
 =2^2%p;
所以我们推广一下 
 求(a^N)mod(p) 
 a^(p-1)≡1(mod p) 
 k=N%(p-1) 
 (a^N)mod(p)=(a^k)mod(p)
对于这一题 
 (2^(N-1))mod(10^9+7) 
 k=(N-1)mod(10^9+7-1)=Nmod(10^9+7-1)-1 
 最后求(2^k)mod(p) 
 由于N很大,我们只能用字符数组从一位开始%mod
参考代码: 
 https://blog.csdn.net/valieli/article/details/52806037
#include <iostream>
#include <stdio.h>
using namespace std;char N[100005];
const int mod=1e9+7;
//费马小定理
long long PhiMa(char *N,int mod)
{long long ans=0;for(int i=0;N[i]!='\0';i++)ans=(ans*10+N[i]-'0')%mod;return ans;
}
//快速幂取余运算
long long FastPow(long long a,long long b)
{long long ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}
int main()
{while(scanf("%s",N)!=EOF){long long n=PhiMa(N,mod-1)-1;long long pp=FastPow(2,n);printf("%lld\n",pp);}return 0;
}