解题:BZOJ 5093 图的价值

题面

显然只需要考虑一个点(再乘n),那么枚举这个点的度数,另外的$\frac{(n-1)(n-2)}{2}$条边是随意连的,而这个点连出去的边又和其余$n-1$个点产生组合,所以答案就是

$n*\frac{(n-1)(n-2)}{2}*\sum\limits_{i=0}^{n-1}C_{n-1}^i i^k$

运用第二类斯特林数和自然数幂的关系展开$i^k$,然后发现后面那一坨只要算到$min(n-1,k)$就可以了(再往后斯特林数就成零了)

于是问题变成了快速求一行第二类斯特林数,多项式卷积即可

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cctype>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N=800006,mod=998244353;
 8 int fac[N],inv[N],rev[N],a[N],b[N];
 9 int n,m,k,G,Gi,C,ans,pw[30][2];
10 void Add(int &x,int y)
11 {
12     x+=y;
13     if(x>=mod) x-=mod;
14 }
15 int Qpow(int x,int p)
16 {
17     if(p==0) return 1;
18     if(p==1) return x;
19     int tmp=Qpow(x,p/2);
20     return p%2?1ll*tmp*tmp%mod*x%mod:1ll*tmp*tmp%mod;
21 }
22 void Prework()
23 {
24     register int i; 
25     scanf("%d%d",&n,&k);
26     fac[0]=inv[0]=1;
27     for(i=1;i<=k;i++) fac[i]=1ll*fac[i-1]*i%mod;
28     inv[k]=Qpow(fac[k],mod-2);
29     for(i=k-1;i;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
30     for(i=0;i<=k;i++) 
31     {
32         a[i]=i%2?mod-inv[i]:inv[i];
33         b[i]=1ll*Qpow(i,k)*inv[i]%mod;
34     }
35     m=1; while(m<=2*k) m<<=1;
36     for(i=1;i<=m;i++)
37         rev[i]=(rev[i>>1]>>1)+(i&1)*(m>>1);
38     G=3,Gi=Qpow(G,mod-2);
39     for(int i=1;i<=24;i++)
40     {
41         pw[i][0]=Qpow(G,(mod-1)/(1<<i));
42         pw[i][1]=Qpow(Gi,(mod-1)/(1<<i));
43     }
44 }
45 void Trans(int *arr,int len,int typ)
46 {
47     register int i,j,k;
48     for(i=0;i<len;i++)
49         if(rev[i]>i) swap(arr[rev[i]],arr[i]);
50     for(i=2;i<=len;i<<=1)
51     {
52         int lth=i>>1,ort=pw[(int)log2(i)][typ==-1];
53         for(j=0;j<len;j+=i)
54         {
55             int ori=1,tmp;
56             for(k=j;k<j+lth;k++,ori=1ll*ori*ort%mod)
57             {
58                 tmp=1ll*ori*arr[k+lth]%mod;
59                 arr[k+lth]=(arr[k]-tmp+mod)%mod;
60                 arr[k]=(arr[k]+tmp)%mod;
61             }
62         }
63     }
64     if(typ==-1)
65     {
66         int Ni=Qpow(len,mod-2);
67         for(i=0;i<=len;i++)
68             arr[i]=1ll*arr[i]*Ni%mod;
69     }
70 }
71 int main()
72 {
73     register int i;
74     Prework();
75     Trans(a,m,1),Trans(b,m,1);
76     for(i=0;i<m;i++) a[i]=1ll*a[i]*b[i]%mod;
77     Trans(a,m,-1),C=1; //for(int i=0;i<=m;i++) printf("%d ",a[i]);
78   //  for(int i=1;i<=n;i++) printf("%d %d\n",fac[i],inv[i]);
79     for(i=0;i<=min(n-1,k);i++)
80     {
81         Add(ans,1ll*a[i]*fac[i]%mod*C%mod*Qpow(2,n-i-1)%mod); 
82         C=1ll*C*(n-i-1)%mod*Qpow(i+1,mod-2)%mod;
83     }
84     int pw=1ll*(n-1)*(n-2)/2%(mod-1);
85     printf("%lld",1ll*ans*n%mod*Qpow(2,pw)%mod);
86     return 0;
87 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/10461998.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值