题意:将1~2n个点两两相连,使得任意两条线段要么相互包含,要么长度相同,问方案数
思路:考虑最长线段的长度len
(1)len > n 时,外层包含内层,方案数为n = 1,n = 2……,n = n - 1 的方案数总和
(2)len <= n 时,所有线段长度相同,长度为len 的线段相互交叉需要2 * len个点,所以方案数为 n 的因子数
综上,n 的方案数为前缀和 + n的因子数
参考思路:https://blog.csdn.net/quinn18/article/details/117236978
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
const int N = 1e6 + 10;
int fac[N], n;
void init() {
for(int i = 1; i <= n; ++i)
for(int j = i; j <= n; j += i) fac[j]++;
}
int main() {
scanf("%d", &n);
if(n == 1) {
printf("1\n");
return 0;
}
init();
ll sum = 1;
for(int i = 2; i < n; ++i)
sum = (2 * sum % mod + fac[i]) % mod;
printf("%lld\n", (sum + fac[n]) % mod);
return 0;
}