A:
a1,a2 a3,a4, a5,a6 ... an-1, an
两两公约数之和为k,因为k < 10 ^ 8,而an < 10 ^ 9,并且要保证每个ai都不相同,
因为两个数最小的公约数是1,如果k < n / 2肯定不行,
否则的话让a3,a4 a5,a6... an-1, an的公约数为1
那么a1,a2公约数为 k - n / 2 + 1就行,所以a1可为k - n / 2 + 1,a2为2 * a1
其余数为ai = ai-1 + 1
#include <cstdio>
#include <cstring>
#include <iostream>
const int MAX_NUMBER = 100007;
using namespace std;
long long n, k;
long long ans[MAX_NUMBER];
int main() {
cin >> n >> k;
if (n == 1) {
if (k == 0) {
printf("1\n");
}
else {
printf("-1\n");
}
return 0;
}
if (k < n / 2) {
printf("-1\n");
return 0;
}
else {
ans[1] = k - n / 2 + 1;
ans[2] = 2 * ans[1];
for (int i = 3; i <= n; i++) {
ans[i] = ans[i - 1] + 1;
}
for (int i = 1; i <= n; i++) {
if (i == 1) {
cout << ans[i];
}
else {
cout << " " << ans[i];
}
}
cout << endl;
}
return 0;
}
B:
典型的DP
dp[i][j]表示长度为i,最后一个数为j的满足条件的数组的个数
那么dp[i][j] = dp[i][j] + dp[i - 1][s] (j % s == 0)
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int MAX_NUMBER = 2007;
const long long MOD_NUMBER = 1000 * 1000 * 1000 + 7;
long long dp[MAX_NUMBER][MAX_NUMBER];
vector<int> factor[MAX_NUMBER];
void getFac() {
for (int i = 1; i < MAX_NUMBER; i++) {
for (int j = 1; j <= i; j++) {
if (i % j == 0) {
factor[i].push_back(j);
}
}
}
}
int n, k;
int main() {
dp[0][1] = 1;
scanf("%d%d", &n, &k);
getFac();
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 0; k < factor[j].size(); k++) {
int cnt_number = factor[j][k];
dp[i][j] = (dp[i][j] + dp[i - 1][cnt_number]) % MOD_NUMBER;
}
}
}
long long ans = 0;
for (int i = 1; i <= n; i++) {
ans = (ans + dp[k][i]) % MOD_NUMBER;
}
cout << ans << endl;
return 0;
}