好的,讓我們逐句解析這段程式碼,並分析其總體功能。
逐句解析
#include<bits/stdc++.h>
using namespace std;
- 引入標準庫,
bits/stdc++.h
是一個包含常用 C++ 標標頭檔案的標頭檔案,簡化了包含過程。
const int mod = 1e9 + 7;
- 定義常量
mod
,值為 (10^9 + 7),用於取模運算,防止大數溢位。
struct er {
int n, k, id;
} a[100010];
- 定義一個結構體
er
,包含三個整數:n
、k
和id
。陣列a
用於儲存最多 100010 個測試案例的輸入。
int c[100010] = { 1 };
- 定義陣列
c
,初始化第一個元素為1
,用於儲存 (2^i \mod (10^9 + 7)) 的值。
int main()
{
- 主函式開始,程式執行從這裡開始。
int t; cin >> t;
- 讀取測試案例的數量
t
。
for (int i = 0; i < t; i++) {
cin >> a[i].n;
}
- 迴圈讀取每個測試案例的
n
值。
for (int i = 0; i < t; i++) {
cin >> a[i].k; a[i].id = i;
}
- 迴圈讀取每個測試案例的
k
值,並將id
設定為當前的索引i
。
int ans = 1;
for (int i = 1; i < 100010; i++) {
ans *= 2; ans %= mod;
c[i] = ans;
}
- 初始化
ans
為1
,計算並儲存 (2^i \mod (10^9 + 7)) 到陣列c
中,利用取模防止溢位。
for (int i = 0; i < t; i++) {
if (a[i].n > a[i].k)
cout << c[a[i].k];
else if (a[i].n == a[i].k) cout << 1;
else cout << 0;
cout << endl;
}
}
- 對每個測試案例進行判斷:
- 如果
n > k
,輸出c[k]
(即 (2^k \mod (10^9 + 7)))。 - 如果
n == k
,輸出1
。 - 如果
n < k
,輸出0
。 - 每次輸出後換行。
- 如果
大體分析
這段程式碼的功能是處理一系列的測試案例,計算特定條件下的結果。具體來說,它計算了給定的 n
和 k
值的關係,並根據這個關係輸出相應的結果,利用了預先計算好的 (2^k \mod (10^9 + 7)) 來提高效率。這種邏輯在許多演算法競賽中很常見,通常用於組合數學或數論問題。你是否對某個特定方面想更深入地探討?
這段程式碼利用了組合數的基本原理以及指數的性質,具體原理如下:
-
組合數的定義:
- 從 (n) 個元素中選擇 (k) 個元素的組合數是 (C(n, k) = \frac{n!}{k! \times (n-k)!})。
- 這裡的選擇是有順序和無重複的。
-
指數的性質:
- (2^k) 表示對 (k) 個元素的所有可能組合,包括選擇和不選擇的情況,因此可以被視為從 (k) 個元素中選擇任意數量元素的方式總數。
-
條件判斷的解釋:
- 當 (n > k):可以從 (n) 個元素中自由選擇 (k) 個,因此輸出所有選擇方式 (c[k])(即 (2^k))。
- 當 (n == k):只有一種方式,就是選擇所有元素,因此輸出 1。
- 當 (n < k):無法選擇更多元素,因此輸出 0。
綜上所述:
這個解決方案透過將組合數問題轉化為指數問題,利用 (2^k) 的性質來簡化計算,從而有效地解決了選擇問題。