题目:
分析与解答:
参考思路:
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;
}