钥匙"/>
牛客网小白月赛8神秘钥匙
题目链接:
时间限制: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);}
更多推荐
牛客网小白月赛8神秘钥匙
发布评论