智商题
例
给出
s.t.
SOL 因为
方案数相同, 我们只需要计算 每个质因子相互独立, 分别背包计数即可.
CF838D
有
SOL 看成一个长度为
的环,其中编号 的点为间隔点(不能被占据),每次每个人可以选一个起点要么逆时针要么顺时针走到第一个空位上。如果编号为 的点被人占据了显然不合法,否则肯定合法。 由于这是一个环,因此最终每个点没被占据的概率都是相同的。即一个点最终没被占据的概率是 ,乘以方案数 即可。
CODE
// Date: 2023-07-31 13:31:48
// Problem: Airplane Arrangements
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF838D
// Memory Limit: 250 MB
// Time Limit: 2000 ms
constexpr int mod = 1e9 + 7;
ll qpow(ll a, ll b, int mod) {
ll res = 1;
while (b) {
if (b & 1)
res = res * a % mod;
b >>= 1;
a = a * a % mod;
}
return res;
}
ll m, n;
signed main() {
fastio();
cin>> n >> m;
ll ans = qpow(2, m, mod) * qpow(n + 1, m, mod) % mod * (n + 1 - m) % mod * qpow(n + 1, mod - 2, mod) % mod;
cout << ans <<endl;
return 0;
}
容斥原理
例
有
SOL 设
表示 的答案,考虑任选前 个不同的数字,则最后一个数字是确定的,方案数为 减掉最后一个数字是
的情况: 减掉最后一个数字和前面某个相同的情况(先枚举位置,再枚举数字):
因此 $ O(n) $ 递推即可。
CF1036F
求
SOL 令
表示最多能开 次方的数字个数, 表示能开 次方的数字个数,则: 我们现在要求
,不难得到 的递推式:
CODE
// Date: 2023-07-31 15:47:45
// Problem: Relatively Prime Powers
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1036F
// Memory Limit: 250 MB
// Time Limit: 2000 ms
constexpr int N = 100;
int pri[N], mu[N], cnt;
void init() {
static bool st[N];
mu[1] = 1;
F(i, 2, N) {
if (!st[i])
pri[++cnt] = i, mu[i] = -1;
for (int j = 1; j <= cnt && i * pri[j] < N; ++j) {
st[i * pri[j]] = 1;
if (i % pri[j] == 0) {
mu[i * pri[j]] = 0;
break;
}
mu[i * pri[j]] = -mu[i];
}
}
}
// 注意开方精度丢失问题
void solve(ll x) {
ll ans = 0;
Fe(i, 1, 60) {
ll p = powl(x, 1.0 / i) + 2;
while (powl(p, i) > x)
p--;
ans += 1ll * mu[i] * (p - 1);
}
cout << ans << endl;
}
signed main() {
fastio();
init();
int T;
cin >> T;
while (T--) {
ll x;
cin >> x;
solve(x);
}
return 0;
}
CF997C
用三种颜色对
SOL 考虑容斥, 设
行 列颜色完全相同, 则答案为
CF1096E
一场游戏有
SOL 先枚举第一个人最后是多少,然后枚举最后有多少个人和第一个人一样,剩下的人强制比第一个人少。
容斥,强制有若干个人至少是
,则 其中 表示剩下
个人, 表示剩下人的总分。
Matrix-Tree 定理
定义
无向图(有向图)的生成树(有向生成树)个数等于基尔霍夫矩阵去掉生成树根所在行列之后的行列式。
本质上是对环容斥,可以计算出,若选了
LGV 引理
模板题
一个 DAG,给定
计算所有偶排列的权重和减掉奇排列的权重和。
s.t.
SOL 设
表示 到 的方案数,那么答案就是矩阵 的行列式。 证明略
例题
NOI2021 路径交点
SOL 交点个数的奇偶性就是排列的奇偶性。裸题。