HDU 4704

题意大概是将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;
}

猜你喜欢

转载自blog.csdn.net/qq_40433083/article/details/84778393
hdu