2019 ICPC Asia Nanjing Regional
A. A Hard Problem
题意:给定一个正整数n,你需要找到最小整数k,对于大小为k的集合{1,2,3…n}的任何子集里,都存在两个不同的整数u,v,u是v的因子。
思路:因子最小是2,所以从大到小找两倍。
#include <iostream>
using namespace std;
int main() {
int T, n;
cin >> T;
while (T--) {
cin >> n;
cout << ((n + 1) / 2 + 1) << endl;
}
return 0;
}
C. Digital Path
题意:寻找路径,路径上的点满足从一端到一端是严格递增1的。求总共有多少条这样的路径。
思路:可以连边建图,然后在拓扑序dp。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e3 + 10;
const ll mod = 1e9 + 7;
int n, m;
int a[N][N];
vector<pii> G[N][N];
int indeg[N][N], outdeg[N][N];
ll f[N][N][5];
void toposort() {
queue<pii> q;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (indeg[i][j] == 0) {
q.push(make_pair(i, j));
f[i][j][1] = 1;
}
}
}
while (!q.empty()) {
pii now = q.front();
q.pop();
for (auto i : G[now.first][now.second]) {
f[i.first][i.second][2] = (f[i.first][i.second][2] + f[now.first][now.second][1]) % mod;
f[i.first][i.second