にこうけいすう
14691 ワード
11050
この係数を求める方法はいくつかありますが、backtrackingで解いて記憶することにしました.
#include <iostream>
#include <vector>
using namespace std;
int n, m, count;
vector<int> vec;
void pick (int curr, int cnt) {
if (cnt == m) {
count++;
return;
}
if (curr == n) return;
vec.push_back(curr);
pick(curr + 1, cnt + 1);
vec.pop_back();
pick(curr + 1, cnt);
}
int main() {
cin >> n >> m;
pick(0 ,0);
cout << count;
}
pick関数は、backtrackingとして5のうち2つを選択するために使用されます.本来ならcount++の位置で、coutであれ何であれ、問題の条件に合えばいいのですが、とにかくこのように解けるのです.11051
今回の問題は,出力数がより大きく,10007の残りに分かれることである.
単純に既存のプールに%10007を追加すると、タイムアウトになります.
タイムアウトが大嫌いです.
調べてみましたが、これはパスカルの三角形で解けた問題です.とっくに知っていたのにもっと数学の授業に励んだ.
#include <iostream>
#define MAX 1010
using namespace std;
int n, k;
int dp[MAX][MAX];
int main() {
cin >> n >> k;
if (n == 0) {
cout << 0;
exit(0);
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) {
if (j == 0) dp[i][j] = 1;
else if (i == j) dp[i][j] = 1;
else dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
}
}
cout << dp[n][k] % 10007;
}
問題は、私はこの係数を10007の値で割ることを要求しているのに、この係数だけを要求して10007で割ると間違っていると思っています.実は.
#include <iostream>
#define MAX 1010
using namespace std;
int n, k;
int dp[MAX][MAX];
int main() {
cin >> n >> k;
if (n == 0) {
cout << 0;
exit(0);
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) {
if (j == 0) dp[i][j] = 1;
else if (i == j) dp[i][j] = 1;
else dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
dp[i][j] = dp[i][j] % 10007;
}
}
cout << dp[n][k] % 10007;
}
各dpに基づいて、この係数は10007に分けるべきである.どうしたんですか。
Reference
この問題について(にこうけいすう), 我々は、より多くの情報をここで見つけました https://velog.io/@blacklandbird/이항계수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol