快轉到主要內容

CSES-1617 Bit Strings

標籤: 數學
目錄

題目連結:https://cses.fi/problemset/task/1617


題意
#

給定一個整數 \( 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; // 輸出所有的組合數
}
Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中