題意#
給定一個整數 \( n \),求長度為 \( n \) 的二進位字串(只包含 0 和 1)
總共有多少種不同的組合?
由於答案可能很大,結果必須對 \( 10^9+7 \) 取模。
思路#
這是一道基礎排列組合題。
字串中的每個位置都有 0 或 1 兩種選擇,
所以長度為 \( n \) 的組合總數為 \( 2^n \)。
實作上可透過迴圈連乘。
指數成長極快,如果全部乘完再取模會發生溢位。
因此,必須在每次乘 2 之後立刻對 \( 10^9+7 \) 取模。
程式碼#
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define INF LONG_LONG_MAX/1000
#define WA() cin.tie(0)->sync_with_stdio(0)
#define all(x) (x).begin(), (x).end()
#define int long long
#define PII pair<int, int>
signed main() { WA();
int n, a = 1;
cin >> n; // 讀取二進位字串的長度 n
// 迴圈跑 n 次,每次乘 2
while (n--) {
a <<= 1; // a 乘上 2,利用位元左移運算加速
a %= (int)1e9+7; // 立刻對 1e9+7 取模,防止溢位爆炸
}
cout << a; // 輸出所有的組合數
}
