牛客網小白月賽8神祕鑰匙
阿新 • • 發佈:2018-12-22
時間限制: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); }