牛客Wannafly挑战赛23F 计数(循环卷积+拉格朗日插值/单位根反演)
传送门
直接的想法就是设 \(x^k\) 为边权,矩阵树定理一波后取出 \(x^{nk}\) 的系数即可
也就是求出模 \(x^k\) 意义下的循环卷积的常数项
考虑插值出最后多项式,类比 \(DFT\) 的方法
假设我们要求
\]
\(A,B,C\) 为多项式
我们知道了 \(A,B\) 的 \(n\) 个点值
\]
\]
那么
\]
而根据消去引理 \(w_n^{k(i+j)}=w_n^{k((i+j)~mod~n)}\)
所以
\]
正好对应了循环卷积,所以只要求得到 \(w_n^{k},(k=0...n-1)\) 的点值就可以得到最后的多项式了
这道题 \(p~mod~k=1\) 所以直接用原根就好了,最后插值一下
upd: 其实最后并不需要插值
根据单位根反演
\]
把多项式的每一项都换成这个东西,得到的值就是要的答案
也就是说直接带入每一个单位根,把矩阵树定理得到的权值加起来最后除去 \(k\) 就好了
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, k, mod, g, pr[233333], tot, a[105][105];
int xi[105], yi[105];
struct Edge {
int u, v, w;
} edge[10005];
inline int Pow(ll x, int y) {
register ll ret = 1;
for (; y; y >>= 1, x = x * x % mod)
if (y & 1) ret = ret * x % mod;
return ret;
}
inline void Inc(int &x, int y) {
x = x + y >= mod ? x + y - mod : x + y;
}
inline void Getrt() {
register int x, i, j;
for (x = mod - 1, i = 2; i * i <= x; ++i)
if (x % i == 0) {
pr[++tot] = i;
while (x % i == 0) x /= i;
}
if (x > 1) pr[++tot] = x;
for (x = mod - 1, i = 2; i <= x; ++i) {
for (g = i, j = 1; g && j <= tot; ++j)
if (Pow(g, x / pr[j]) == 1) g = 0;
if (g) break;
}
}
inline int Gauss() {
register int ans = 1, i, j, l, inv;
for (i = 1; i < n; ++i) {
for (j = i; j < n; ++j)
if (a[j][i]) {
if (i != j) swap(a[i], a[j]), ans = mod - ans;
break;
}
for (j = i + 1; j < n; ++j)
if (a[j][i]) {
inv = (ll)a[j][i] * Pow(a[i][i], mod - 2) % mod;
for (l = i; l < n; ++l) Inc(a[j][l], mod - (ll)a[i][l] * inv % mod);
}
ans = (ll)ans * a[i][i] % mod;
}
return ans;
}
int main() {
register int i, j, w, u, v, ans;
scanf("%d%d%d%d", &n, &m, &k, &mod), Getrt();
for (i = 1; i <= m; ++i) scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w);
xi[0] = 1, xi[1] = Pow(g, (mod - 1) / k);
for (i = 0; i < k; ++i) {
if (i > 1) xi[i] = (ll)xi[i - 1] * xi[1] % mod;
memset(a, 0, sizeof(a));
for (j = 1; j <= m; ++j) {
u = edge[j].u, v = edge[j].v, w = Pow(xi[i], edge[j].w);
Inc(a[u][u], w), Inc(a[v][v], w), Inc(a[u][v], mod - w), Inc(a[v][u], mod - w);
}
yi[i] = Gauss();
}
for (i = ans = 0; i < k; ++i) {
for (w = yi[i], j = 0; j < k; ++j)
if (i ^ j) w = (ll)w * (mod - xi[j]) % mod * Pow((xi[i] + mod - xi[j]) % mod, mod - 2) % mod;
Inc(ans, w);
}
printf("%d\n", ans);
return 0;
}
牛客Wannafly挑战赛23F 计数(循环卷积+拉格朗日插值/单位根反演)的更多相关文章
- 牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树)
牛客wannafly 挑战赛14 B 前缀查询(trie树上dfs序+线段树) 链接:https://ac.nowcoder.com/acm/problem/15706 现在需要您来帮忙维护这个名册, ...
- 牛客~~wannafly挑战赛19~A 队列
链接:https://www.nowcoder.com/acm/contest/131/A来源:牛客网 题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi ...
- 牛客Wannafly挑战赛23 B.游戏
游戏 题目描述 小N和小O在玩游戏.他们面前放了n堆石子,第i堆石子一开始有ci颗石头.他们轮流从某堆石子中取石子,不能不取.最后无法操作的人就输了这个游戏.但他们觉得这样玩太无聊了,更新了一下规则. ...
- 牛客Wannafly挑战赛11E 白兔的刁难
传送门 如果大力推单位根反演就可以获得一个 \(k^2logn\) 的好方法 \[ans_{t}=\frac{1}{k}\sum_{i=0}^{k-1}(w_k^{-t})^i(w_k^i+1)^n\ ...
- 【牛客Wannafly挑战赛23】F 计数
题目链接 题意 给定一张边带权的无向图,求生成树的权值和是 k 的倍数的生成树个数模 p 的值. \(n\leq 100,k\leq 100,p\mod k=1\) Sol 看见整除然后 \(p\mo ...
- 牛客 Wannafly 挑战赛26D 禁书目录 排列组合 概率期望
原文链接https://www.cnblogs.com/zhouzhendong/p/9781060.html 题目传送门 - NowCoder Wannafly 26D 题意 放一放这一题原先的题面 ...
- 牛客Wannafly挑战赛26E 蚂蚁开会(树链剖分+线段树)
传送门 题面描述 一颗n个节点的树,m次操作,有点权(该节点蚂蚁个数)和边权(相邻节点的距离). 三种操作: 操作1:1 i x将节点i的点权修改为x.(1 <= i <= n; 1 &l ...
- 牛客 Wannafly挑战赛27 D 绿魔法师
传送门 \(\color{green}{solution}\) 分析下,在\(1e5+1\)内,一个数的约数个数最多为\(2^{6}\)个,所以我们可以考虑枚举约数 复杂度\(O(N^{2^{6 \t ...
- [牛客Wannafly挑战赛27D]绿魔法师
description newcoder 给你一个空的可重集合\(S\). \(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作: \(opt\ 1\):在S中加入x. \( ...
随机推荐
- 浅谈Android选项卡(四)
前面几篇介绍的选项的用法,基本上使用TabActivity.ViewPager.已经基本上满足开发需求了.但是这里再介绍一种小技巧,在有的时候,感觉使用前面的ViewPager和Fragment时候, ...
- Spring中applicationContext.xml详解
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- Swagger2使用记录
1. Swagger2使用记录 1.1. Bean配置文件 @Configuration public class Swagger2 { @Bean public Docket createRestA ...
- mysql工具——mysqlcheck(MYISAM)
基本介绍 演示: 使用optimize的时候,可能会出现 Table does not support optimize, doing recreate + analyze instead 这时候参考 ...
- ADC新库
1.单次采集模式 1.在STM32CUBMX中设置为单次采集模式 2.在C文件中用HAL_ADC_START()函数启动ADC 3.用HAL_ADC_PollForConversion()延时等待采集 ...
- 最近用.NET实现DHT爬虫,全.NET实现
最近用.NET实现DHT爬虫,全.NET实现,大家可以加我QQ交流下 309159808
- hdu1024 Max Sum Plus Plus 滚动dp
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Java 语言结构【转】
Java 语言结构 基础:包(Package).类(Class)和对象(Object) 了解 Java 的包(Package).类(Class)和对象(Object)这些基础术语是非常重要的,这部分内 ...
- ToolkitScriptManager vs. ScriptManager 关于“只能向页面中添加 ScriptManager 的一个实例”讨论
在使用ASP.NET设计AJAX功能网页时,需要首先声明ToolkitScriptManager或者ScriptManager控件,这些全局的脚本核心控制,然后才能使用众多的AJAX控件.如果没有创建 ...
- Javac词法分析
参考:<深入分析Java Web>技术内幕 许令波 词法分析过程涉及到的主要类及相关的继承关系如下: 词法分析的接口为Lexer,默认实现类为Scanner,Scanner会逐个读取Jav ...