HDU 4704 Sum【费马小定理+快速幂】

本文深入探讨了快速模幂算法的实现,并结合费马小定理解决特定数学问题。介绍了如何通过快速模幂算法高效计算大数的幂次方模运算,以及费马小定理在求解模运算中的应用。

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

题意:把n分成若干个数相加有几种分法。

1、把n分成若干个数:类似排列组合问题,把n个数分成若干个数,在n个数中间插板,有n-1个空位,一共2^(n-1)种分法

2、降幂:题目中最后mod(10^9+7),10^9+7是素数。与费马小定理相联系

前提:m是质数

化简:

费马小引理:

所以:

3、还需要用到快速模幂

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

typedef unsigned long long LL;  

const int modd=1e9+7;
  
// 快速模幂计算函数  
LL powermod(LL a, LL n, LL m)  
{  
   LL res = 1;  
    while(n) {  
        if(n & 1) {        // n % 2 == 1  
            res *= a;  
            res %= m;  
        }  
        a *= a;  
        a %= m;  
        n >>= 1;  
    }  
  
    return res;  
}  

int main(){
	char s[100005];
	while(gets(s)){
		int len=strlen(s);
		LL result=0;
		for(int i=0;i<len;i++){
			result=(result*10+s[i]-'0')%(modd-1);   //在将字符串转化为整数的过程中一直取模 
		}
		result=(result-1)%(modd-1);   //2^n-1
		printf("%lld\n",powermod(2,result,modd));   
	}
	
	
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值