[关闭]
@exut 2024-11-14T02:56:24.000000Z 字数 1593 阅读 136

20241114_KCR_互测

考试总结


T1

全场唯一可做题,虽然场上想歪了

表示现在取完了 的点组成图,环的大小的 的贡献和

显然答案与编号无关的,于是我们可以枚举当前编号最大点所在环的大小转移,既然答案与编号无关,那么答案就分成了两部分:一边是一个环,这一部分是好处理的,等会再说

另一部分是一个相同的子问题,可能会感觉好像这个结构不一样因为你选之后点编号已经乱了,但是由于答案和编号无关所以直接重新编号是一样的不是吗

于是左半边的子问题就是 ,可以用set来辅助转移,用 实现从而减小无用状态的访问,这样复杂度就正确了,可过

一种可能的实现:

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N=105;
  5. const int mod=998244353;
  6. int inv[N],fac[N],finv[N];
  7. int C(int n,int m){
  8. return (fac[n]*finv[n-m]%mod)*finv[m]%mod;
  9. }
  10. typedef pair<int,int> pii;
  11. int n,k;
  12. int qpow(int a,int b){
  13. int ret=1;
  14. while(b){
  15. if(b&1) ret=(ret*a)%mod;
  16. a=a*a%mod;
  17. b>>=1;
  18. }
  19. return ret;
  20. }
  21. void init(){
  22. inv[0]=inv[1]=fac[0]=fac[1]=finv[0]=1;
  23. for(int i=2;i<=100;i++)
  24. inv[i]=inv[mod%i]*(mod-mod/i)%mod;
  25. for(int i=1;i<=100;i++){
  26. fac[i]=fac[i-1]*i%mod;
  27. finv[i]=finv[i-1]*inv[i]%mod;
  28. }
  29. }
  30. #define mk make_pair
  31. set<pii> S[N];
  32. int LCM(int a,int b){
  33. return a*b/__gcd(a,b);
  34. }
  35. void modi(int pos,int lcm,int cnt){
  36. auto it=S[pos].upper_bound(mk(lcm,0));
  37. if(it==S[pos].end() or (*it).first!=lcm){S[pos].insert(mk(lcm,cnt));return ;}
  38. cnt=cnt+(*it).second,cnt%=mod;
  39. S[pos].erase(it);
  40. S[pos].insert(mk(lcm,cnt));
  41. }
  42. signed main(){
  43. freopen("aporia.in", "r", stdin);
  44. freopen("aporia.out","w",stdout);
  45. ios::sync_with_stdio(0);
  46. cin.tie(0),cout.tie(0);
  47. init();
  48. cin>>n>>k;
  49. if(k==0){
  50. cout<<fac[n];
  51. return 0;
  52. }
  53. S[1].insert(mk(1,1));
  54. for(int i=2;i<=n;i++){
  55. S[i].insert(mk(i,fac[i-1]));
  56. for(int j=1;j<i;j++){
  57. int cnt=C(i-1,j-1)*fac[j-1]%mod;
  58. for(auto I:S[i-j]){
  59. int tot=I.second*cnt%mod;
  60. int lm=LCM(I.first,j);
  61. modi(i,lm,tot);
  62. }
  63. }
  64. }
  65. int ans=0;
  66. for(auto I:S[n]){
  67. ans=(ans+I.second*qpow(I.first,k)%mod)%mod;
  68. }
  69. cout<<ans;
  70. }

感觉还有别的做法,比如刚下考xzy爷爷说他是根据分拆数什么做的,做题思路应该是不唯一的,但是这样应该是比较简单的吧

后三题选择性放弃了,不太可改

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注