HDU 4704 Sum (高精度+快速幂+费马小定理+二项式定理)

本文探讨了将一个大整数N拆分为1至N个数的所有可能方案数量的计算方法。利用组合数学原理,通过插空分组的方法,得出答案为2^(N-1)。文中提供了一种高效的计算方式,并使用费马小定理解决取模问题。

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

Sum
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u
Submit  Status  Practice  HDU 4704

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. 
题意:给定一个很大的整数N,把N分成1,2,3,4....N个数,问一共有多少种方案。
题解:把这个问题看做是有N个箱子,N-1个空,插空分组,一共有多少种方案。
   
分成1份则是C(n-1,0);
   分成2份则是C(n-1,1);
   分成3份则是C(n-1,2);
   ...
   分成n份则是C(n-1,n-1);
   ans = sum( C(n-1,i) ) (0<=i<=n-1)=2^(n-1);(二项式定理)
   由于要取模 而且 2 与 mod 互质 ,因此可以用费马小定理来降幂。
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll pow(ll a,ll b,ll m)
{
    int ans=1;
    while(b)
    {
        if(b&1)
            ans=ans*a%m;
        b>>=1;
        a=a*a%m;
    }
    return ans;
}
ll get(char c[])
{
    ll sum=c[0]-'0';
    int len=strlen(c);
    for(int i=1;i<len;i++)
        sum=(sum*10+(c[i]-'0'))%(mod-1);
    return sum;
}
int main()
{
    char c[100005];
    while(cin>>c)
    {
        ll sum=get(c);
        ll ans=pow(2,sum-1,mod);
        cout<<ans<<endl;
    }
}

 

 
   

转载于:https://www.cnblogs.com/Ritchie/p/5648110.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值