邻接表的NTT(毒瘤系数开不下二维数组)

NTT任意模数模板(+O(1)快速乘) NTT任意模数的方法其实有点取巧。两个数列每个有n个数,每个数的大小最多是10^9。如果没有模数,那么卷积过后每个位置的答案一定小于10^9*10^9*n,差不多是10^24左右那么就有一个神奇的做法,选3个乘积大于10^24的NTT模数,分别做一次,得到每个位上模意义下的答案,然后用中国剩余定理得到模上三个质数乘积的答案。因为答案显然小于三个质数乘积,那么模上三个质数乘积的答案就是这个数应该的值... 阅读详情

Wan fl 20D

题意:M个Q群,每个群有si个人,每个群至少选一个,选K个人的方案数

思路:每个群挑选的生成函数为\small G(i)=\sum_{i=0}^{si }\binom{si}{i}x^{i},答案就是m个G(i)的生成函数之积后

的\small x^{K}的系数   生成函数之积NTT,多个相乘,加个分治,

此题需要用邻接表。。原来的板子不适用了

#include <bits/stdc++.h>
using namespace std;
  
const int MOD = 998244353;
const int N = 401000;//大概4倍  
inline int Add(int x, int y) { x += y; if(x >= MOD) x -= MOD; return x; }
inline int Dec(int x, int y) { x -= y; if(x < 0) x += MOD; return x; }
inline int Mul(int x, int y) { return 1LL * x * y % MOD; }
inline int Kissme(int x, int y) {
  int c = 1;
  while(y) {
    if(y & 1) c = Mul(c, x);
    x = Mul(x, x);
    y >>= 1;
  }
  return c;
}

namespace FFT {   //固定板子 
	int L, l, rev[N << 1];
  
    void Pre(int n) {
        for(l = 0; (1 << l) < n; l++); L = 1 << l;
        for(int i = 0; i < L; i++) rev[i] = rev[i >> 1] >> 1 | (i & 1) << (l - 1);
    }
	void Dft(int *a) {
    	for(int i = 0; i < L; i++)
    		if(i > rev[i]) swap(a[i], a[rev[i]]);
   		for(int i = 1; i < L; i <<= 1) 
		{
       		int wn = Kissme(3, (MOD - 1) / (i << 1));//原根修改处 
        	for(int j = 0; j < L; j += i << 1)
   	    	for(int w = 1, k = 0; k < i; k++, w = Mul(w, wn)) 
     		{
        		int u = a[j + k], v = Mul(w, a[i + j + k]);
      			a[j + k] = Add(u, v);
      			a[i + j + k] = Dec(u, v);
    		}
    	}
 	}
	void Idft(int *a) {
    	reverse(a + 1, a + L); int inv = Kissme(L, MOD - 2);
    	Dft(a);
    	for(int i = 0; i < L; i++)
     		a[i] = Mul(a[i], inv);
	}
}
  
vector<int> Mul(vector<int> a, vector<int> b) {
	using namespace FFT;
	vector<int> c;
	int n = a.size() + b.size() - 1;
	if(1LL * a.size() * b.size() <= (a.size() + b.size()) * 20LL) {
    	c.resize(n);
    	for(int i = 0; i < a.size(); i++)
      		for(int j = 0; j < b.size(); j++)
    			c[i + j] = Add(c[i + j], Mul(a[i], b[j]));
        return c;
  	}
    Pre(n);//固定操作  更新L 
    c.resize(L); a.resize(L); b.resize(L);
    Dft(&a[0]); Dft(&b[0]);
    for(int i = 0; i < L; i++)
        c[i] = Mul(a[i], b[i]);
    Idft(&c[0]);
    c.resize(n);
    return c;
}
  
int fac[N], inv[N], fa[N], siz[N], n, K, m;
vector<vector<int> > All;
vector<int> T[N << 2];
  
void Init(void) {//预处理阶乘 
	fac[0] = 1; int lim = 100001;
	for(int i = 1; i <= lim; i++) fac[i] = Mul(fac[i - 1], i);
  	inv[lim] = Kissme(fac[lim], MOD - 2);
  	for(int i = lim - 1; i >= 0; i--) inv[i] = Mul(inv[i + 1], i + 1);//乘 
}
int C(int x, int y) {
  	if(y > x) return 0;
  	return Mul(fac[x], Mul(inv[y], inv[x - y]));
}
void Solve(int o, int l, int r) {//分治 多个多项式相乘 
  	if(l == r) return(void)(T[o] = All[l]);
  	int mid = l + r >> 1;
  	Solve(o << 1, l, mid);
  	Solve(o << 1 | 1, mid + 1, r);
  	T[o] = Mul(T[o << 1], T[o << 1 | 1]);
}
  
int main(void) {
  	Init();
  	scanf("%d%d%d", &n, &m, &K);
  	All.clear();
  	for(int i = 1; i <= m; i++) 
	{
   		vector<int> x;//第i个多项式的系数 
   		x.push_back(0);
   		int y;
    	scanf("%d", &y);
   		for(int j = 1; j <= y; j++)
       		x.push_back(C(y, j));
    	All.push_back(x);//ALL就是所有多项式的系数集合 
 	}
  	Solve(1, 0, All.size() - 1);//一共all.size个多项式 
  	printf("%d\n", T[1][K]);//x^K的系数 
  	return 0;
}

 

[C++]图的邻接矩阵、邻接表及其相互转化和邻接表的广度遍历、深度遍历 先贴程序,明天再写详细的原理和过程 #include #include #include using namespace std; const int MAXVEX = 100; typedef char VertexType; typedef int EdgeType; //邻接矩阵 typedef struct { int num; EdgeType weight; }ElemType 阅读详情

相关推荐

图的存储结构:1.二维数组邻接矩阵存储 2.数组模拟邻接表存储

图的存储结构:1.二维数组邻接矩阵存储 2.数组模拟邻接表存储

千里快哉风的博客 1221

【NTT】【二维卷积】最佳农场

题意: 分析: 翻转矩阵后,就是个二维卷积。 所谓二维卷积,其实就是把位置(i,j)映射到一个多项式的第i*m+j次项,然后就是一维卷积。。。 说得牛逼其实很傻 多的位置用0补齐即可。 复杂度O(R∗C+R∗C∗log(R∗C))O(R*C+R*C*log(R*C))O(R∗C+R∗C∗log(R∗C)) #include&lt;cstdio&gt; #include&lt;cstring&g...

氧化钠的博客 928

C++合并有序数组

合并有序数组 【问题描述】编写一个程序,将两个元素从小到大有序的一维数组归并成一个有序的一维数组。 【输入形式】用户在第一行输入第一个有序数组的元素数目,以回车结束此输入。然后在第二行按照刚才输入的元素数目依次输入数组元素,中间用空格分隔,最后用回车结束输入。第三行和第四行只需重复刚才的步骤,将第二个有序数组也输入即可。输入时候一定是有序输入的,即数组元素已经按照从小到大顺序排列。 【输出形式】程序将两个有序一维数组合并为一个有序数组并按照从小到大顺序输出。每个元素输出时用空格分隔,最后一个输出之后没有空格

qjsssss的博客 4243

【NTT】【二维卷积】CodeChef BuyingLand

分析: 非常脑残的二维卷积题 把式子平方暴力拆开,然后发现得到的6个式子居然可以算。 3个直接O(1)求得。 2个需要二维前缀和。 剩下一个用二维卷积。 #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;algorithm&gt; #define SF scanf #define PF printf #define MAXN 14...

氧化钠的博客 419

VirusTotal API密钥获取与Python实战:从注册到自动化威胁分析

在网络安全和自动化运维领域,API(应用程序编程接口)是实现系统间数据交互与功能集成的核心技术。其工作原理是通过预定义的协议和端点,允许程序化访问特定服务的数据与功能。对于安全工程师和威胁分析师而言,API的价值在于能够将手动、重复的安全操作(如文件扫描、情报查询)转化为自动化工作流,从而极大提升威胁检测与响应的效率。一个典型的应用场景是集成第三方威胁情报平台,以实现对可疑文件、URL或哈希值的批量与实时分析。本文聚焦于全球知名的威胁情报服务VirusTotal,详细解析其API密钥的注册流程、安全配置要点

weixin_28707739的博客 420

ICG cell如何通过Latch结构消除与门clock gating中的glitch?

本文深入解析了ICG Cell如何利用Latch结构解决传统与门时钟门控中的毛刺问题。通过将电平敏感锁存器与门控与门结合,ICG Cell将使能信号的变化严格限制在时钟低电平的安全窗口内采样和锁存,从而在时钟有效沿期间提供稳定的控制信号,从根本上消除了因信号延迟不同步而产生的glitch,确保了门控时钟的纯净与电路功能的可靠性。

weixin_29234423的博客 468

【NTT】【真·二维卷积】Codechef Chef and Bike

分析: 太忙(lan)了不想写,附我看的链接 https://www.cnblogs.com/ivorysi/p/8868453.html #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;algorithm&gt; #define SF scanf #define PF printf #define MAXN 25 #defin...

氧化钠的博客 530

USB接口ESD防护设计实战:从金属外壳到信号线的完整避坑指南

本文深入探讨USB接口ESD防护设计的实战要点,聚焦金属外壳作为ESD能量泄放关键通道的处理策略。文章详细解析了从外壳接地路径控制、信号线TVS管选型与布局,到PCB分区及电源线滤波等完整设计流程,旨在帮助硬件工程师构建系统级防护,避免常见设计误区,确保产品通过严苛的静电测试。

k8l9m0n的博客 481

FFT & NTT学习心得

FFT—快速傅里叶变换 基本功能 在O( (n+m)log(n+m) )的时间复杂度内计算:n次多项式乘m次多项式. 实现方式 欲求多项式A*多项式B, 对多项式A,B分别进行快速傅里叶变换,分别得到A1,B1; 将A1,B1的对应项相乘得到多项式C1; 即:C1[i]=A1[i]*B1[i] 其中C1[i]表示C1的第i项系数. 多项式C1进行逆变换得到多项式C; 则多项式C

lym01803的博客 6962

排除 AcroForm 中 JavaScript 脚本的 Bug

本文介绍了Acrobat JavaScript脚本故障排除的基本方法。首先应检查控制台窗口的错误报告,通过具体示例演示了5类常见错误:语法错误(如缺少大括号)、未终止字符串、未定义变量、运算符混淆及变量作用域问题,并逐步给出修复方案。文章还提供了调试流程UML图和实用经验总结,强调关注细节(如分隔符匹配)、正确使用运算符和变量作用域等要点。最后建议采用系统化调试方法,包括关闭/重新打开表单等完整性测试。

小猫三两只。 1503

Transformers在自动驾驶领域的应用(High-level like in scene)

Transformers uses global attention mechanism to capture long-range interaction information. Two core modules in Transformers are Self-Attention and Cross-Attention, which defined asAttn(Q,K,V)=softmax(QK⊤dk)VSelfAttn(X)=Attn(WQX,WKX,WVX)CrossAttn(X,Y)=Attn

qq_39337332的博客 1775

邻接表和邻接矩阵

进入图论的大门(深渊)之前,不会存图可不行,来来来,邻接表和邻接矩阵拿去花

My vegetable has exploded. 1万+

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

数据结构-非线性结构:图形结构【邻接矩阵(二维数组)、邻接表(链表数组 / 红黑树数组)】

数据结构-非线性结构:图形结构

u013250861的博客 336

解决MiGPT部署痛点:小米账号异地登录安全验证的解决方案

为让小米音箱更智能🤖,部署MiGPT时遇到小米账号异地登录验证问题,手动验证后仍无法解决。本文分享亲测有效的简化方案✨:通过浏览器F12获取passToken📝,手动创建mi.json配置文件并挂载到Docker容器,无需本地运行MiGPT,直接绕过异地验证,附完整操作步骤和问题排查指南。

XiaoqiangClub的博客 1443

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 730

数据结构与算法——图的邻接表表示法类的C++实现

数据结构与算法——图的邻接表表示法类的C++实现

Be The Best! 8421

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

算法导论 思考题6-3(Young氏矩阵)

思考题6-3(Young氏矩阵)在一个m×nm\times nm×n的Young氏矩阵(Young tableau)中,每一行的数据都是从左到右排序的,每一列的数据都是从上到下排列的。Young氏矩阵中也会存在一些为∞\infin∞的数据项,表示那些不存在的数据。因此,Young氏矩阵可以用来村出r≤mnr \leq mnr≤mn个有限的数。 a. 画出一个包含元素{9,16,3,2,4,8,5,...

生命不息,代码不止 561

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Leetcode 4.寻找两个正序数组的中位数(困难)

题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 示例 3: 输入:nums1 = [0,0],

明朗晨光的专栏 691

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C语言程序设计基础OJ练习题(实验六一维数组)

一、C语言实验——最值 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 有一个长度为n的整数序列,其中最大值和最小值不会出现在序列的第一和最后一个位置。 请写一个程序,把序列中的最小值与第一个数交换,最大值与最后一个数交换。输出转换好的序列。 Input 输入包括两行。 第...

Gyp郭小帅的博客 1万+

Codeforces #219 (Div. 2) A. Collecting Beats is Fun

A. Collecting Beats is Fun time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Cucumber boy is fan of Kyubeat, a

小华在努力~ 957

SPFA的两种实现形式(二维数组与数组模拟邻接表)

SPFA的二维数组和数组模拟邻接表实现形式,二维数组的表现形式易于理解但存储空间的实用性较差,而数组模拟邻接表的形式则解决了这个问题。

Maiidamai的博客 592

组合数学刷题姬

  例题1.洛谷P4491  ,给NMS&lt;=1e7,NTT 题意:N个位置,每个位置可以染为M种颜色,若位置恰有K种颜色出现S次,则获得愉悦度WK 问所有愉悦度之和 https://blog.youkuaiyun.com/animalcoder/article/details/81267633   例题2 hdu5730  CDQ+NTT+DP 题意:已知连续i(1&lt;=i&lt;=n...

animalcoder 3611

图还可以这样存——邻接表的数组实现

之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。 4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 复制代码         第一行两个整数n m。n表示顶

不可数的爱 ! 5906
上一篇: NTT(FFT)+CDQ优化DP
下一篇: uvalive1140 组合数学+二项式反演+预处理cmk
animalcoder
博客等级 码龄9年 43粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值