HDU 4704 Sum Fermat定律

本文介绍了一个关于大数高幂次求余的算法问题。通过将问题转化为求2^(N-1)%1E9+7,利用快速幂算法解决大数运算中的求余问题。文章给出了具体的C++实现代码,并引用了相关博客作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description
 

Sample Input
2
 

Sample Output
2
Hint
1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases.

好难理解的题意。

S(1)是代表把数字N分解为1个数,S(2)代表把N分解为2个数,S(3)代表把N分解为3个数。

其和都不等于N。

最后问把S(1) + S(2) + .. S(N)加起来的和有多少个?

就是个计数的问题。

最后得到公式这种和有2^(N-1)个。

最后问题转化为求大数2^(N-1) % 1E9 + 7的一个高幂次数求余问题。

參考了下这个博客:http://blog.youkuaiyun.com/xingyeyongheng/article/details/10910543


数学思维好抽象的。

const int SIZE = 100001;
const int MOD = int(1E9 + 7);

char nums[SIZE];

__int64 Fermat(char *n, int mod)
{
	__int64 ans = 0;
	for (int i = 0; n[i]; i++)
	{
		ans = (ans * 10L + n[i] - '0') % mod;
	}
	return ans;
}

__int64 fastPow(__int64 base, __int64 p)
{
	p = (p + MOD) % MOD;

	__int64 ans = 1;
	while (p)
	{
		if (p & 1) ans = ans * base % MOD;
		base = base * base % MOD;
		p >>= 1;
	}
	return ans;
}

int main()
{
	while(gets(nums) != NULL)//scanf("%s", nums) != EOF)
	{		
		__int64 n = Fermat(nums, MOD-1) - 1;  
		printf("%I64d\n",fastPow(2, n));  
	}  
	return 0; 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值