输入n,sum,求1~n的数,如何排列之后,相邻两列相加,直到得出最后的结果等于sum,
3 1 2 4
4 3 6
7 9
16
枚举每种排列组合的情况,算sum,合适就退出。
算的时候别傻乎乎的去模拟,用笔算一下就会发现,每次算sum的每个系数是有规律的,是杨辉三角。
0.这道题一次过,Good!
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>
#include <stdlib.h>
#include <stdio.h>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) x<<1
#define r(x) x<<1|1
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
int yh[10][10] = {
1,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,
1,2,1,0,0,0,0,0,0,0,
1,3,3,1,0,0,0,0,0,0,
1,4,6,4,1,0,0,0,0,0,
1,5,10,10,5,1,0,0,0,0,
1,6,15,20,15,6,1,0,0,0,
1,7,21,35,35,21,7,1,0,0,
1,8,28,56,70,56,28,8,1,0,
1,9,36,84,126,126,84,36,9,1,
};
int n, m,ans;
int de[11];
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++)
de[i] = i + 1;
while (next_permutation(de, de + n)) {
ans = 0;
for (int i = 0; i < n; i++) {
ans += yh[n - 1][i] * de[i];
}
if (ans == m) break;
}
for (int i = 0; i < n; i++) {
cout << de[i] << " ";
}
cout << endl;
return 0;
}
476

被折叠的 条评论
为什么被折叠?



