求和(第二斯特林数+ntt)

news/2024/7/15 19:32:05 标签: 算法, c++, 图论

题目:

https://www.luogu.com.cn/problem/P4091

思路:

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<unordered_map>
using namespace std;
#define  LL long long 
const int N =4e5+100;
const double PI = acos(-1);
LL mod = 998244353,gi=3,gg,g[N],f[N],h[N],rel[N];
int n, tot, bit;
LL quick(LL a, LL b, LL mod)
{
    LL ans = 1;
    while (b)
    {  
        if (b & 1) ans = ans * a % mod;
        b >>= 1;
        a = a * a % mod;
    }
    return ans;
}
void init()
{  
    h[0] = 1;
    for (int i = 1; i <= n; i++)
        h[i] = i * h[i - 1] % mod;
    g[0] = f[0] = 1;
    g[1] = -1;
    f[1] = (n + 1)%mod;
    for (int i = 2; i <= n; i++)
    {
        LL x = quick(h[i], mod - 2, mod), y = quick(i, n + 1, mod)-1;
        g[i] = x;
        if (i % 2) g[i] *= -1;
        x =quick((h[i]*(i - 1))%mod, mod - 2, mod);
        f[i] = x * y % mod;
    }
}
void ntt(LL a[], int op)
{
    for (int i = 0; i < tot; i++)
        if (i < rel[i]) swap(a[i], a[rel[i]]);
    for (int m = 2; m <= tot; m <<= 1)
    {
        LL gk = quick(op == 1 ? gi : gg, (mod - 1) / m, mod);
        for (int i = 0; i < tot; i += m)
        {
            LL  g1 = 1;
            for (int j = 0; j < m / 2; j++)
            {
                LL x = a[i + j], y = a[i + j + m / 2] * g1%mod;
                a[i + j] = (x + y) % mod;
                a[i + j + m / 2] = ((x - y) % mod + mod) % mod;
                g1 = g1 * gk % mod;
            }
      }
    }
    if (op == -1)
    {
        LL gk = quick(tot, mod - 2, mod);
        for (int i = 0; i < tot; i++)
            a[i] = a[i] * gk % mod;
    }
}
int main() {
    cin >> n;
    init();
    while ((1 << bit) < 2 * n + 1) bit++;
    tot = 1 << bit;
    for (int i = 0; i < tot; i++) rel[i] = rel[i / 2] / 2 + ((i & 1) ? tot / 2 : 0);
    gg = quick(gi, mod - 2, mod);
    ntt(f, 1);
    ntt(g, 1);
    for (int i = 0; i < tot; i++)
        f[i] = f[i] * g[i] % mod;
    ntt(f, -1);
    LL ans = 0;
   
    for (int i = 0; i <= n; i++)
    {
        ans = (ans + h[i] * quick(2,i,mod) % mod * f[i] % mod) % mod;
    }
    cout << ans << endl;
    return 0;
}

 


http://www.niftyadmin.cn/n/5417332.html

相关文章

数据分析-Pandas数据画箱线图

数据分析-Pandas数据画箱线图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&#xff…

Java的API-01-Math(含面试大厂题和源码)

在Java面试中&#xff0c;关于Math类的问题通常考察候选人对基本数学运算和函数的理解以及如何在实际问题中应用这些方法。以下是三道涉及Math类的面试题&#xff0c;包含问题描述、示例代码以及解析。 面试题1: 实现幂运算优化 问题描述: 不使用Math.pow方法&#xff0c;如何…

IRLINK(红外遥控器)

工具 1.Proteus 8 仿真器 2.keil 5 编辑器 原理图 讲解 简介 红外遥控&#xff1a;是利用红外线进行通信的设备&#xff0c;由红外LED调制后的信号发出&#xff0c;由专用的红外接头进行解调&#xff1b; 通信方式&#xff1a;单工、异步&#xff1b; 红外LED波长&#x…

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤&#xff1a; 1. 卸载旧版本的Docker 首先&#xff0c;需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…

关于InfiniBand的技术问答

随着大数据和人工智能技术的进步&#xff0c;对高性能计算的需求不断增长。为了满足这一需求&#xff0c;英伟达&#xff08;NVIDIA&#xff09;Quantum-2 InfiniBand平台为用户提供了卓越的分布式计算性能&#xff0c;实现高速和低延迟的数据传输和处理能力。 这些是关于IB技术…

R语言的数据类型与数据结构:向量、列表、矩阵、数据框及操作方法

R语言的数据类型与数据结构&#xff1a;向量、列表、矩阵、数据框及操作方法 介绍向量列表矩阵数据框 介绍 R语言拥有丰富的数据类型和数据结构&#xff0c;以满足各类数据处理和分析的需求。本文将分享R语言中的数据类型&#xff0c;包括向量、列表、矩阵、数据框等&#xff…

留学|谈PS|耶鲁大学管理学院招生办执行主任谈个人PS

仅仅为了共同学习与分享 内容提要:在一篇个人自述中&#xff0c;我们要求申请人将他们的过去和未来有机地结合起来。我们把这种自传叫作“职业目标”自传。它为我们提供了确凿的信息&#xff0c;同时也可以确定申请人是否具有对自己及其职业的综合性反思能力。通常的情况是&am…

一篇文章带你了解Python数据分析

目录 一、什么是数据分析&#xff1f; 二、为什么学习数据分析&#xff1f; 三、数据分析实现流程 一、什么是数据分析&#xff1f; 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来&#xff0c;总结出所研究对象的内在规律。 使得数据的价值最大化 指定促销活动的方…