【AGC005F】Many Easy Problems (NTT)

Description

​ 给你一棵\(~n~\)个点的树和一个整数\(~k~\)。设为\(~S~\)为树上某些点的集合,定义\(~f(S)~\)为最小的包含\(~S~\)的联通子图的大小。\(~n~\)个点选\(~k~\)个点一共有\(~C_n^k~\)种方案,请你求出所有方案的\(~f(S)~\)的和, 对\(~924844033~\)取模。

​ 求所有\(~k \in [1, ~n]~\)的答案。
看题戳我

Solution

​ 首先看到这道题,根本不会快速求\(~f(S)~\),所以换一个角度,考虑每个点对于答案的贡献。不难发现, 对于单独一个\(~k~\),一个点\(~u~\)会产生贡献当且仅当这\(~k~\)个点不全在以\(~u~\)的相邻节点为根的子树中,根据容斥可以得到一个点对一个\(~k~\)的贡献为\(~C_n^k - \sum_{v \in {nex_u}} ^{} {C_{siz_v}^k}~\),观察这个式子,可以发现计算总贡献时每个点的子树大小会被计算两次,一个是本身子树大小\(~siz_u~\),一个是\(~n - siz_u~\),而 \(~C_n^k~\)被计算了\(~n~\)次,所以有
\[ Ans_k = n \times {n \choose k} - \sum_{i = 1} ^ n {num_i \times {i \choose k}} \]
​ 其中,\(num_i~\)表示子树大小为\(~i~\)的子树个数,这样已经可以卷后半部分了,但是我们想要一个更简便的式子。

定义一个新的\(~cnt_i~\)表示
\[ cnt_i = \begin{cases} n, ~ i = n\\ -num_i, ~ i \neq n \end{cases} \]
所以上面的式子可以更简便的表示为
\[ Ans_k = {\sum_{i = 1}^{n} cnt_i \times {i \choose k}} = \frac{1}{k!}~{\sum_{i = 1}^{n}} ~\frac{cnt_i \times i!}{(i - k)!} \]
​ 那么把\(~cnt_i \times i!~\)放一起,\(~\frac{1}{(i - k)!}~\)放一起, 用一个\(~FFT~\)套路把\(~(i - k)~\)倒过来之后就可以卷起来了。

​ 但是为了求了这个更简便的式子会导致\(~cnt_i \times i!~\)可能是负数,而我的\(~NTT~\)已经习惯了这样写,look down,因为普通题目中要卷起来的一般都是正的,所以一开始就把这题要卷的东西变成正的也是可以的。

a[j + k] = (x + y) % mod, a[j + k + (i >> 1)] = (x - y + mod) % mod; 

​ 而我一开始没有转正,所以这样写很不优秀,因为一旦\(~y~\)是一个比较小的负数,那么\(~(x - y + mod)~\)就爆\(~int~\)了,我因为这里调了一个晚上+一个下午,很难受。

最后提一下这个题的模数是\(~924844033~\),所以原根是\(~5~\)而不是熟知的\(~3~\)

Code

#include<bits/stdc++.h>
#define For(i, j, k) for(int i = j; i <= k; ++i)
#define Forr(i, j, k) for(int i = j; i >= k; --i)
#define Travel(i, u) for(int i = beg[u], v = to[i]; i; i = nex[i], v = to[i])
using namespace std;inline int read() {int x = 0, p = 1; char c = getchar();for(; !isdigit(c); c = getchar()) if(c == '-') p = -1;for(; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);return x *= p;
}inline void File() {
#ifndef ONLINE_JUDGEfreopen("AGC005F.in", "r", stdin);freopen("AGC005F.out", "w", stdout);
#endif
}const int N = 2e5 + 10, maxn = N << 2, mod = 924844033;
int a[maxn], b[maxn], e = 1, beg[N], nex[N << 1], to[N << 1]; 
int rev[maxn], bit, len, siz, invg[maxn], powg[maxn]; 
int fac[N], inv[N], cnt[N], sz[N], u, v, n;inline int qpow(int a, int b) {int res = 1;for (; b; a = 1ll * a * a % mod, b >>= 1) if (b & 1) res = 1ll * res * a % mod;return res;
}inline void Init(int n) {fac[0] = inv[0] = 1;For(i, 1, n) fac[i] = 1ll * i * fac[i - 1] % mod;inv[n] = qpow(fac[n], mod - 2);Forr(i, n - 1, 0) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
}inline void add(int x, int y) {to[++ e] = y, nex[e] = beg[x], beg[x] = e;to[++ e] = x, nex[e] = beg[y], beg[y] = e;
}inline void dfs(int u, int f) {sz[u] = 1;Travel(i, u) if (v != f) dfs(v, u), sz[u] += sz[v];-- cnt[sz[u]], -- cnt[n - sz[u]];
}inline void NTT(int *a, int flag) {For(i, 0, siz - 1) if (rev[i] > i) swap(a[rev[i]], a[i]);for (int i = 2; i <= siz; i <<= 1) {int wn = flag ? powg[i] : invg[i];for (int j = 0; j < siz; j += i) {int w = 1;for (int k = 0; k < (i >> 1); ++ k, w = 1ll * w * wn % mod) {int x = a[j + k], y = 1ll * w * a[j + k + (i >> 1)] % mod;a[j + k] = (x + y) % mod, a[j + k + (i >> 1)] = (x - y) % mod; }}}if (!flag) {int g = qpow(siz, mod - 2);For(i, 0, siz - 1) a[i] = 1ll * g * a[i] % mod;}
}int main() {File(), Init(N - 5);n = read();For(i, 2, n) u = read(), v = read(), add(u, v);dfs(1, 0), cnt[n] = n;for (siz = 1; siz <= (n << 1); siz <<= 1) ++ bit;For(i, 0, siz - 1) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1));int g = qpow(5, mod - 2);for(int i = 1; i <= siz; i <<= 1) {invg[i] = qpow(g, (mod - 1) / i),powg[i] = qpow(5, (mod - 1) / i);}For(i, 0, n) {a[i] = 1ll * cnt[i] * fac[i] % mod;b[i] = inv[n - i];}NTT(a, 1), NTT(b, 1);For(i, 0, siz) a[i] = 1ll * a[i] * b[i] % mod;NTT(a, 0);For(i, 1, n) {int ans = 1ll * a[n + i] * inv[i] % mod;ans = (ans + mod) % mod;printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/LSTete/p/9506171.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现在学python和java哪个好_java和python学习哪个未来发展前景更好?

原标题&#xff1a;java和python学习哪个未来发展前景更好&#xff1f; 学java和python哪个更好&#xff1f;这是现在大家热议的一个问题。 Python崛起这已经是一个不争的事实&#xff0c;并且已经成为人工智能时代的第一语言。Python的优势就是在任何方面都非常强大。号称胶水…

同步IO、异步IO、阻塞IO、非阻塞IO、复用IO

参考&#xff1a;同步IO 异步IO 作者&#xff1a;今天天气眞好 发布时间&#xff1a; 2021-04-19 09:42:29 网址&#xff1a;https://blog.csdn.net/qq_51118175/article/details/115857196?spm1001.2014.3001.5501 目录同步IO与异步IO的区别&#xff1f;1.POSIX2.IO模型阻塞I…

java线程之基础学习

java线程之基础学习总结 线程实现的两种方式&#xff1a;在java中可以有两种方式实现多线程操作&#xff0c;一种是继承Thread类&#xff0c;另外一种是实现Runnable接口。 继承Thread类Thread类是在java.lang包中定义的一个类只要继承Thread类&#xff0c;要覆写run()方法。简…

Scala 学习笔记

Scala 学习笔记 1 object func_exp {2 println("Welcome to the Scala worksheet") //> Welcome to the Scala worksheet3 def hello(name: String): String {4 s"Hello, ${name}"5 } …

python反编译exe_实战 Python3.7+64位 Exe 反编译

记得有年在上海弘连培训&#xff0c;其中一个逆向题就是关于python的Exe&#xff0c;当时就想着写个文档&#xff0c;后来因为忙就拖延了下来&#xff1b;这里补上&#xff0c;而且是大补上&#xff1a;奉献一个干货&#xff0c;网上没有(我没发现)Python3.7的反编译教程&#…

树莓派外设开发之接入语音模块

参考&#xff1a;树莓派接入语音模块控制继电器组 作者&#xff1a;糯米啊啊 发布时间&#xff1a; 2021-04-18 17:07:08 网址&#xff1a;https://blog.csdn.net/weixin_43732386/article/details/115834317?spm1001.2014.3001.5501 目录1.前言2.思路3.材料4.二次开发语音模块…

php程序里如何实现图片翻页,php图片上传代码一例-php 生成翻页链接(页码)列表的...-带多种分页方式的php分页类_169IT.COM...

Class PAGE {//类开始/********************************************************* $total 记录总数* $pageNum 每页显示的条数* $url 链接* $page->StartPage(显示分类统计,字符分类/数字分页,跳转);* $page->StartPage(true/false, true/false, true/f…

图片圆角

2019独角兽企业重金招聘Python工程师标准>>> //切图为圆角 public static Bitmap removeYuanjiao(Bitmap bitmap,int pixels){ int width bitmap.getWidth(); int height bitmap.getHeight(); Bitmap creBitmap Bitmap.createBitmap(width, height, android.grap…

Java和.NET(C#)的开发用到的技术对比总结

前言 声明&#xff1a;我指的是一般的Java和.NET(C#)的后台开发用到的技术总结 最近一直在应聘ing&#xff0c;楼主的项目还是.NET(C#)项目居多&#xff0c;Java项目相对少&#xff0c;在这也吐槽下&#xff0c;招.NET(C#)的公司实在是少的可怜&#xff0c;其实非常喜欢C#语法和…

python测试用例管理模块_python-selenium并发执行测试用例(方法一 各模块每一条并发执行)...

总执行代码: # codingutf-8 import unittest,os,time import HTMLTestRunner import threading import sys sys.path.append(C:/Users/Dell/Desktop/CARE/program)#使用编辑器&#xff0c;要指定当前目录&#xff0c;不然无法执行第20行代码 def creatsuite(): casedir [] lis…

全国计算机等级考试题库二级C操作题100套(第71套)

第71套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;将形参s所指字符串中的所有数字字符顺序前移&#xff0c;其他字符顺序后移&#xff0c;处理后新字符串的首地址作为函数值返回。 例如&#xff0c;s所指字符串为&#xff1a;asd123fgh5##43df&#xff0…

修改oracle用户资源限制,RHEL5中安装Oracle11gR2修改用户SHELL限制、环境配置、内核参数...

修改用户的SHELL的限制[rootlocalhost &#xff5e;]# vi /etc/security/limits.conf# /etc/security/limits.conf##Each line describes a limit for a user in the form:## ##Where:# can be:# - an user name# - a group name, with group syntax#…

input 赋值_FPGA基础设计:Verilog行为级建模(过程赋值)

来源&#xff1a;CSDN文章使用逻辑门和连续赋值对电路建模&#xff0c;是相对详细的描述硬件的方法。使用过程块可以从更高层次的角度描述一个系统&#xff0c;称作行为级建模(behavirol modeling)。1. 过程赋值阻塞赋值和非阻塞赋值的区别都很熟悉了。这里记录两个特性。1.1 特…

本地配置DNS服务器(MAC版)

转自https://www.cnblogs.com/skylor/p/7483959.html作为一个前端开发者&#xff0c;会遇到使用cookie的情况&#xff0c;常见的如&#xff1a;登录&#xff0c;权限控制&#xff0c;视频播放&#xff0c;图形验证码等&#xff0c;这时候本地开发者在PC上会使用修改hosts的方式…

全国计算机等级考试题库二级C操作题100套(第72套)

第72套&#xff1a; 给定程序中&#xff0c;函数fun的功能是计算下式 例如&#xff0c;若形参e的值为1e-3&#xff0c;函数的返回值2.735678。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意&#xff1a;源程序存放在考生文件夹下的BLANK1.C中…

JAVA操作Excel表格

一、JExcelApi 可以从文件或者输入流进行读取操作。 基本步骤&#xff1a; 1.由文件或者输入流创建一个workbook; 2.由workbook的getSheet()方法创建一个工作表Sheet&#xff08;两种方法&#xff0c;下标和名字&#xff0c;下标从0开始&#xff09;&#xff1b; 3.由Sheet的ge…

Oracle监听注册和sqlnet,Oracle监听的动态注册与静态注册

Oracle监听介于Oracle的数据库和客户端之间的通道。因为数据库本身不对外提供服务&#xff0c;所以需要通过监听器来实现。几个相关的参数&#xff1a;local_listenerdb_domainremote_listenerservice_names相关命令&#xff1a;监听命令&#xff1a;lsnrctl参数&#xff1a;1、…

mme设备内部错误_华为拟安装“俄版安卓”;百度回应内部贪腐;Android Studio 3.5 RC2 发布 | 极客头条...

快来收听极客头条音频版吧&#xff0c;智能播报由标贝科技提供技术支持。「CSDN 极客头条」&#xff0c;是从 CSDN 网站延伸至官方微信公众号的特别栏目&#xff0c;专注于一天业界事报道。风里雨里&#xff0c;我们将每天为朋友们&#xff0c;播报最新鲜有料的新闻资讯&#x…

[spring mvc]Hello World入门

1.新建项目 File->New->Other,选择Dynamic web project&#xff1a; 项目建好之后&#xff0c;目录结构如下&#xff1a; 2.WEB-INF/web.xml 中配置 dispatcherServlet <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"ht…

Mysql日期函数使用大全

为什么80%的码农都做不了架构师&#xff1f;>>> 1.1 获得当前日期时间&#xff08;date time&#xff09;函数&#xff1a;now() 除了 now() 函数能获得当前的日期时间外&#xff0c;MySQL 中还有下面的函数&#xff1a; current_timestamp() current_timestamp …