牛客网小白月赛8神秘钥匙

题目链接:https://ac.nowcoder.com/acm/contest/214/C

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
clccle一行?个人来到了一个诡异的世界,她们需要去寻找逃出这个地方的方法——找到神秘的所罗门之匙
她们决定从中随机选出一些人去寻找钥匙,并在其中选出一个队长,clccle不想知道自己有多大几率被选中,她只想知道一共有多少种选择的方案 (选出的人数要在1−?之间,不同的队长算不同的方案)。
方案数对1000000007取模
输入描述:第一行,一个整数?。
输出描述:一个整数,表示方案数。
示例1
输入
2
输出
4
说明:四种方案:(1),(1,2)其中1是队长,(2,1),(2)其中2是队长
备注:1 ≤ ? ≤ 10的9次方

解析问题,发现一定要选一个队长,那就n种方案,剩下的人可以去可以不去就是2的n次方
总的选择方法:n*pow(2,n)

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int n;
    long long a=1;
    scanf("%d",&n);
    a=n;
    for(int i=0;i<n-1;i++)
    {
        a*=2;
        a%=1000000007;
    }
    printf("%lld",a);
     
 }

直接求解,运行超时

那就减少复杂度,2的63次方会lld范围就用62次方,建议减少约62倍的计算

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int n;
    long long a=1,num62;
    scanf("%d",&n);
    num62= 4611686018427387904%1000000007;
    for(int i=0;i<n-1;)
    {
    	if(n-1-i>63)
    	{
    		a=a*num62;
            a=a%1000000007;
            i+=62;
		}
        else 
        {
        	a*=2;
        	i++;
        	//printf("%lld\n",a);
		}
    }
    a=a%1000000007;//注意要先%一次,不然这里也有可能爆lld范围
    a*=n;//必须先计算上面的再计算这个,不然答案错误,这个道理很明显
    a=a%1000000007;
    printf("%lld",a);
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值