1. 程式人生 > >牛客網小白月賽8神祕鑰匙

牛客網小白月賽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);
 }