【HDU 4704】 Sum 费马小定理

博客介绍了如何运用数论中的费马小定理和快速幂算法来解决HDU 4704题目的Sum问题。通过隔板法和二项式定理分析问题,当数值过大时,利用费马小定理降低指数,通过计算2(n-1)%(mod-1)来高效求解,确保指数在1e9+8范围内,从而实现快速求解。
摘要由CSDN通过智能技术生成

在这里插入图片描述

题意:将n依次分割成1->n块,每块和为n,问共有多少种分法。

思路:

隔板法,分割成k块的时候,即是n-1个间隙里放入k-1个隔板。C(k-1,n-1),累加,利用二项式定理即是求2n-1
但是由于n太大,需要用费马小定理降幂。因为2和p互质,那么2p-1和1对p同余,那我们看2n-1能分出多少个2p1,这部分利用同余定理就都变成乘1,只需要求出2(n-1)%(mod-1)即可,指数在1e9+8以内,这个时候利用快速幂就可以快速求出来了

AC代码:

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define pb push_back
#define mp make_pair
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值