問題 b: 運
時間限制: 1 sec 記憶體限制: 128 mb
【問題背景】
zhx 和妹子們玩數數遊戲。
【問題描述】
僅包含4或7的數被稱為幸運數。乙個序列的子串行被定義為從序列中刪去若干個數, 剩下的數組成的新序列。兩個子串行被定義為不同的當且僅當其中的元素在原始序列中的下標的集合不相等。對於乙個長度為 n的序列,共有 2^n個不同的子串行。( 包含乙個空序列)。乙個子串行被稱為不幸運的, 當且僅當其中不包含兩個或兩個以上相同的幸運數。對於乙個給定序列, 求其中長度恰好為 k 的不幸運子串行的個數, 答案 mod 10^9+7 輸出。
【輸入格式】
第一行兩個正整數 n, k, 表示原始序列的長度和題目中的 k。
接下來一行 n 個整數 ai, 表示序列中第 i 個元素的值。
【輸出格式】
僅乙個數,表示不幸運子串行的個數。( mod 10^9+7)
【樣例輸入】
3 21 1 1
【樣例輸出】
3【樣例輸入】
4 24 7 4 7
【樣例輸出】
4【樣例解釋】
對於樣例 1,每個長度為 2 的子串行都是符合條件的。
對於樣例 2,4個不幸運子串行元素下標分別為:, , , 。注意下標集對應的子串行不是「不幸運」的, 因為它包含兩個相同的幸運數4.
【資料規模與約定】
對於50%的資料, 1 ≤n ≤ 16。
對於70%的資料, 1 ≤ n ≤ 1000, ai ≤ 10000。
對於100%的資料, 1 ≤ n ≤ 100000,k ≤ n, 1 ≤ ai ≤ 109。
考試時讀錯題了,幸運數是指這個數字裡只包含4或7,而兩者皆有也是幸運數。10^9裡幸運數不太多,可以打個表看看。統計所有出現的幸運數個數,如果某個唯一,刪掉直接當普通數處理,因為無論如何也構不出兩個相同的來成為幸運數。
設幸運數種數為tot,剩下數個數為cnt
min(tot,k)
ans= σ c (cnt,k-i)*dp[tot][i];
i=0
就是說,求k個數中放了i個不重複的幸運數的方案之和。
dp陣列的轉移:dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*c[i];
i為推到第幾種幸運數,j表示選了幾個,c[i]即為這種幸運數的總個數。
求組合數可以考慮用lucas
#include#include#include#include#include#include#define ll long long
#define mod 1000000007
#define inf 1000000000
using namespace std;
ll read()
while(x>='0'&&x<='9')
return sum*f;
}ll n,a[100005],k,tot,cnt,ans=0,f[2000][2000],c[2000],hh,b[2000];
mapmp;
int check(int x)
mp[p]=++hh;
return 1;
}ll cheng(ll x,ll m)
return ans;
}ll get(ll n,ll m)
else
cnt++;
dp();
for(int i=0;i<=min(tot,k);i++)
cout<
組合數 dp 運
問題 b 運 時間限制 1 sec 記憶體限制 128 mb 問題背景 zhx 和妹子們玩數數遊戲。問題描述 僅包含4或7的數被稱為幸運數。乙個序列的子串行被定義為從序列中刪去若干個數,剩下的數組成的新序列。兩個子串行被定義為不同的當且僅當其中的元素在原始序列中的下標的集合不相等。對於乙個長度為 n...
DP演算法求組合數
dp演算法求組合數 中學就學過排列,組合 比如 c5,2 10 c6,2 15 如果用演算法實現的話,難道也要先做一連串的乘法,然後再相除嗎?比如 c5,2 5 4 3 2 3 2 如果數很大的話,又是乘又做除的,多牛的計算機才能搞定呢?先看看簡單的 2個數選2個,共有1種方法 3個數選2個,共有3...
和組合數有關的dp
1.用dp i r 表示,前i個盒子已經放完了,手上還拿著r對同色球。狀態轉移方程為 dp i 1 r a b dp i r comb r,a comb r a,b comb sum 2 r,c i a 2 b 2.見3.見 4.這題我記得我在還不會求逆元的時候就會了 乙個物品乙個物品考慮 每個是c...