添加好友(快速幂取模)

“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛D题——添加好友

描述
Tony最近喜欢上了龙之谷游戏,所以他想叫上他的好友组建一个公会来一起享受这款游戏。

Tony一共有n个好友,他可以叫上任意k(1<=k<=n)个好友来组建公会,并且所有好友都会答应他的请求。问Tony一共可以有多少种方案组建这个公会?

只要不是完全相同的人组建的方案视为不同方案,并且Tony至少要叫上一个人。

描述
多组输入,每组一行,输入一个正整数n(1<=n<=1000000000)。

输出
每组输出一行,输出方案数。(对1000000007取膜)

样例输入
2

样例输出
3


思路:首先由题目分析知道,方案数是 C(n,1)+C(n,2)+…+C(n,n),第一时间想到的是pow(2,n)-1;但是由于n的范围是(1<=n<=1000000000),所以用pow不但慢而且会溢出。
再一想直接用快速幂的模板就好。


快速幂模板,表示a的b次方对p取模


    int fast(int a,int b,int p) 
    {  
        long long a1=a,t=1;
        while(b>0)  
        { 
            if(b&1)  
                t=(t%p)*(a1%p)%p;
            a1=(a1%p)*(a1%p)%p;  
            b/=2;  
        }
        return (int)(t%p);
    }



AC代码


    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<set>
    #include<algorithm>
    #include<cmath>
    using namespace std;

    int fast(int a,int b,int p)

    {  
        long long a1=a,t=1;
        while(b>0)  
        { 
            if(b&1)  
                t=(t%p)*(a1%p)%p;
            a1=(a1%p)*(a1%p)%p;  
            b/=2;  
        }
        return (int)(t%p);
    }

    int main()
    {
        int n;
        while(scanf("%d",&n) != EOF)
        {
            long long x = fast(2,n,1000000007)-1;         //注意要-1
            printf("%lld\n", x);
        }
        return 0;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值