CF1528F AmShZ Farm 题解

思路#

首先,原题意要你求:

i=0n(ni)iknni

其实比较板子吧。

i=0n(ni)iknni

=i=0n(ni)j=1k{kj}(ij)j!nni(普通幂拆开)=j=1k{kj}j!i=0n(ni)(ij)nni=j=1k{kj}j!i=0nn!i!i!(ni)!j!(ij)!nni=j=1k{kj}n!i=0nnni(ni)!(ij)!=j=1k{kj}n!(nj)!i=0n(njni)nni=j=1k{kj}n!(nj)!(1+n)nj(二项式定理)=j=1k1j!i=0j(ji)(1)jiikn!(nj)!(1+n)nj(斯特林数拆开)=j=1k(nj)i=0j(ji)(1)jiik(1+n)nj=i=1kik(1)ij=ik(nj)(ji)(1)j(1+n)nj=(1+n)ni=1kik(1)ij=ik(nj)(ji)(11+n)j=(1+n)ni=1kik(1)ij=ikn!j!(nj)!j!i!(ji)!(11+n)j=(1+n)ni=1kik(1)i(ni)j=ik(niji)(11+n)j=(1+n)ni=1kik(ni)(11+n)ij=0ki(nij)(11+n)j

fi=j=0ki(nij)(11+n)j

那么:

fifi+1=j=0ki(nij)(11+n)jj=0ki1(ni1j)(11+n)j=(niki)(11+n)ki+j=1ki1(ni1j1)(11+n)j=(niki)(11+n)ki+j=0ki2(ni1j)(11+n)j+1=(niki)(11+n)ki+fi+1×11+n(ni1ki1)(11+n)ki=(ni1ki)(11+n)ki+fi+1×11+n

所以:

fi=(ni1ki)(11+n)ki+fi+1(1+11+n)

递推即可。

发现上面所有的东西都可以线性处理。

时间复杂度:O(k)

Code#

#include <bits/stdc++.h>
using namespace std;

#define fro(i, x, y) for (int i = (x); i <= (y); i++)
#define pre(i, x, y) for (int i = (x); i >= (y); i--)

typedef long long i64;

const int N = 1e6 + 10;
const int mod = 998244353;

int n, k, ct;
int r, num, sum, ans;
int f[N], iv[N], fc[N], vs[N], pr[N], sm[N];

inline i64 power(i64 x, i64 y) {
  i64 res = 1;
  while (y) {
    if (y & 1) res = res * x % mod;
    x = x * x % mod, y /= 2;
  }
  return res;
}
inline i64 C1(int x, int y) {
  if (x < 0 || y < 0 || x - y < 0) return 0;
  while (r < x) ++r, num = 1ll * num * r % mod;
  return 1ll * num * iv[y] % mod;
}
inline i64 C2(int x, int y) {
  if (x < 0 || y < 0 || x - y < 0) return 0;
  return 1ll * (sum = 1ll * sum * (n - y + 1) % mod) * iv[y] % mod;
}

signed main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> k;
  i64 p1 = mod - power(1 + n, mod - 2);
  i64 p2 = mod - p1;
  fc[0] = 1;
  fro(i, 1, k) fc[i] = 1ll * fc[i - 1] * i % mod;
  iv[k] = power(fc[k], mod - 2);
  pre(i, k, 1) iv[i - 1] = 1ll * iv[i] * i % mod;
  r = n - k, sum = 1, num = n - k;
  if (n > k) {
    f[k] = 1;
    for (int i = k - 1, pw = p1; i >= 0; i--, pw = p1 * pw % mod) {
      f[i] = (f[i + 1] * (p1 + 1) + C1(n - i - 1, k - i) * pw) % mod;
    }
  } else {
    i64 p = mod + 1 - p2; f[n] = 1;
    for (int i = n - 1; i >= 1; i--) {
      f[i] = f[i + 1] * p % mod;
    }
  }
  sm[1] = 1;
  fro(i, 2, k) {
    if (vs[i] == 0) pr[++ct] = i, sm[i] = power(i, k);
    for (int j = 1; j <= ct && pr[j] * i <= k; j++) {
      vs[pr[j] * i] = 1;
      sm[pr[j] * i] = 1ll * sm[pr[j]] * sm[i] % mod;
      if (i % pr[j] == 0) break;
    }
  }
  for (int i = 1, pw = p2; i <= k; i++, pw = p2 * pw % mod) {
    i64 val = sm[i];
    val = val * C2(n, i) % mod;
    val = val * pw % mod;
    ans = (ans + f[i] * val) % mod;
  }
  ans = ans * power(1 + n, n) % mod;
  cout << (ans % mod + mod) % mod << "\n";
  return 0;
}

作者:JiaY19

出处:https://www.cnblogs.com/JiaY19/p/18211107

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   JiaY19  阅读(9)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示