思路:如果正著計算容易出現遺漏,所以我們只用找 「a>b&&a是b的倍數」的方案數,然後用總數減去這個方案數就是答案。
思考用dp來解決這個問題,設dp[i][j]表示長度為 i 的陣列第 i 位為 j 的符合要求的陣列方案數。(1<=i<=n 1<=j<=k)
**邏輯:n個數的陣列,先初始化dp[1][i] = 1。三重迴圈,通過優化計算得時間複雜度為o(n^2 logn),即可以計算出
t(n) = 5*10^6。在迴圈中先計算長度為 i 時所有可能的陣列個數(不考慮題目的條件),用sum記錄。然後計算確定 j 時的(a>b && a是b的倍數)的方案數,用dum記錄。然後用sum-dum,計算出dp[i][j]。
(計算中別忘了取模)
#includeusing namespace std;
const int maxn = 3e6+10;
const int modd = 1e9+7;
typedef long long ll;
const int inf = 0x3f3f3f3f;
int dp[20][100000];
int main()
int sum = 0,dum = 0;
for(int i = 2;i <= n;++i)
for(int j = 1;j <= k;++j)
dp[i][j] = (sum-dum)%modd;}}
for(int i = 1;i <= k;i++)
cout
}
牛牛與陣列(DP)
牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 輸入兩個整數n,k 1 n 10 1 k 100000輸出乙個整數輸入 2 2輸出3輸入 9 1輸出1輸入 3 ...
牛牛與陣列(DP)
牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列,對1e9 7取模 輸入兩個整數n,k 1 n 10 1 k 100000輸出乙個整數 dp i j 表示前i個序列,第i個位j的時...
dp 牛牛與陣列
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 牛牛喜歡這樣的陣列 1 長度為n 2 每乙個數都在1到k之間 3 對於任意連續的兩個數a,b,a b 與 a b 0 兩個條件至少成立乙個 請問一共有多少滿足條件的陣列...