A - Sum HDU - 4704

题意:将N拆分成1~N个数,求拆分方法的总数,则:S_{1}+S_{2}+......+S_{n}=2^{n-1}再将其对\left ( 10^{9}+7 \right )取模。

但是数据达到了10^{100000}级。

费马小定理:当p是一个素数并且a和p互质时,a^{p-1} % p=1

于是: clip_image002[6]% m=   clip_image002[12]

#include <stdio.h>
#include <string.h>
#define MAX 100005
#define mod 1000000007

char s[MAX];
long long pow(long long a, long long b)
{
	long long base = a, r = 1;
	while (b != 0)
	{
		if (b & 1)
			r = (r*base) % mod;
		base = (base*base) % mod;
		b /= 2;
	}
	return r % mod;
}
int main()
{
	while (scanf("%s", s) != EOF)
	{
		int len = strlen(s);
		long long num = 0;
		for (int i = 0; i<len; i++)//大数取模
			num = (num * 10 + (int)(s[i] - '0')) % (mod - 1);
		if (num == 0)//说明num=mod-1
		{
			printf("%lld\n",pow(2, mod - 2));
		}
		else
		{
			num--;
			printf("%lld\n", pow(2, num));
		}
	}
	return 0;
}

好难。。。

猜你喜欢

转载自blog.csdn.net/weixin_43850622/article/details/84697836