[51nod 1258] [伯努利数] [多项式求逆] [任意模数NTT] 序列求和 V4

伯努利数:数学中的神奇序列 伯努利数最初是通过对整数幂和的研究而发现的。Smn1m2m3mnmSm​n1m2m3mnmSmn1m1∑k0mm1kBk⋅nm1−kSm​nm11​k0∑m​km1​Bk​⋅nm1−k其中BkB_kBk​就是伯努利数。 阅读详情

接http://blog.youkuaiyun.com/coldef/article/details/57908865

上次做一套模拟赛的时候,其中需要求自然数k次幂和,然后我只会n^2的…我记得n^2有20分,nlogn求可以爆到90分……
这里写图片描述
——鏼鏼鏼2015年国家集训队论文

大概就这样多项式求个逆,求出生成函数就可以了
这样是 O(nlogn) ,但这道题模数不是满足NTT要求的素数……可以取三个NTT的素数,使得这三个素数乘积大于 nP2 ,就可以用CRT合并了。

至于为什么要大于 nP2 ,因为如果直接上FFT,一次FFT后每个数不会大于 nP2 ,那么如果我们选了三个素数p1,p2,p3,用CRT可以求出模p1*p2*p3后的余数,因为p1*p2*p3>n*p^2,那么这样求出来后模题目要求的模数就可以了……其实原理挺简单的,但是我理解的半天……

不过直接上CRT要爆longlong,可以用一个小技巧处理

这里写图片描述
——图自AntiLeaf的博客

这样每次NTT分成三个素数的NTT,再合并,就可以了

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>

using namespace std;

typedef long long ll;

const int N=300010,P=1e9+7;
const int p1=998244353,p2=1004535809,p3=469762049;

inline char nc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}

inline void rea(int &x){
    char c=nc(); x=0;
    for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}

inline void rea(ll &x){
    char c=nc(); x=0;
    for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}

inline ll Pow(ll x,ll y,ll p){
    x%=p; ll ret=1;
    for(;y;y>>=1,x=x*x%p) if(y&1) ret=ret*x%p;
    return ret;
}

const ll M_=1LL*p1*p2,inv1=Pow(p1,p2-2,p2),inv2=Pow(p2,p1-2,p1),inv3=Pow(M_%p3,p3-2,p3);

int rev[N],fac[N],inv[N],a[N],b[N];

struct NTT{
    int P,num;
    int w[2][N];
    void Pre(int p,int n){
        P=p; num=n;
        int ng=Pow(3,(P-1)/num,P),ig=Pow(ng,P-2,P);
        w[1][0]=w[0][0]=1;
        for(int i=1;i<num;i++)
            w[1][i]=1LL*w[1][i-1]*ng%P,w[0][i]=1LL*w[0][i-1]*ig%P;
    }
    void FFT(int *a,int n,int r){
        for(int i=1;i<n;i++) if(rev[i]>i) swap(a[i],a[rev[i]]);
        for(int i=1;i<n;i<<=1)
            for(int j=0;j<n;j+=(i<<1))
                for(int k=0;k<i;k++){
                    int x=a[j+k],y=1LL*a[j+k+i]*w[r][num/(i<<1)*k]%P;
                    a[j+k]=(x+y)%P; a[j+k+i]=(x+P-y)%P;
                }
        if(!r) for(int i=0,inv=Pow(n,P-2,P);i<n;i++) a[i]=1LL*a[i]*inv%P;
    }
}ntt[3];

inline void Pre(int n){
    fac[0]=1; for(int i=1;i<=n;i++) fac[i]=1LL*fac[i-1]*i%P;
    inv[1]=1; for(int i=2;i<=n;i++) inv[i]=1LL*(P-P/i)*inv[P%i]%P;
    inv[0]=1; for(int i=1;i<=n;i++) inv[i]=1LL*inv[i]*inv[i-1]%P;
}

inline ll mul(ll a,ll b,ll p){
  a%=p; b%=p;
  return ((a*b-(ll)((ll)((long double)a/p*b+1e-3)*p))%p+p)%p;
}

inline int CRT(int a1,int a2,int a3){
    ll A=(mul(1LL*a1*p2%M_,inv2,M_)+mul(1LL*a2*p1%M_,inv1,M_))%M_;
    ll K=(1LL*a3+p3-A%p3)*inv3%p3;
    return (K*(M_%P)+A)%P;
}

int _b[3][N],__b[N];

void Inv(int *a,int *b,int n){
    static int tmp[N];
    if(n==1) return void(b[0]=CRT(Pow(a[0],p1-2,p1),Pow(a[0],p2-2,p2),Pow(a[0],p3-2,p3)));
    Inv(a,b,n>>1);
    int L=0; while(!(n>>L&1)) L++;
    for(int i=1;i<(n<<1);i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<L);
    for(int k=0;k<3;k++)
        for(int i=0;i<n;i++) _b[k][i]=b[i],_b[k][i+n]=0;

    for(int k=0;k<3;k++){
        for(int i=0;i<n;i++) tmp[i]=a[i],tmp[i+n]=0;
        ntt[k].FFT(tmp,n<<1,1); ntt[k].FFT(_b[k],n<<1,1);
        for(int i=0;i<(n<<1);i++) _b[k][i]=1LL*_b[k][i]*tmp[i]%ntt[k].P;
        ntt[k].FFT(_b[k],n<<1,0);
    }
    for(int i=0;i<n;i++) _b[0][i]=_b[1][i]=_b[2][i]=(P-CRT(_b[0][i],_b[1][i],_b[2][i]))%P;
    _b[0][0]=_b[1][0]=_b[2][0]=(_b[0][0]+2)%P;

    for(int k=0;k<3;k++){
        for(int i=0;i<n;i++) tmp[i]=b[i],tmp[i+n]=0;
        ntt[k].FFT(tmp,n<<1,1); ntt[k].FFT(_b[k],n<<1,1);
        for(int i=0;i<(n<<1);i++) _b[k][i]=1LL*_b[k][i]*tmp[i]%ntt[k].P;
        ntt[k].FFT(_b[k],n<<1,0);
    }
    for(int i=0;i<n;i++) b[i]=CRT(_b[0][i],_b[1][i],_b[2][i]);
}

int t,k;
ll n;

inline int C(int x,int y){
    return 1LL*fac[x]*inv[y]%P*inv[x-y]%P;
}

int main(){
    int M=1; for(;M<=50000;M<<=1);
    ntt[0].Pre(p1,M<<1);
    ntt[1].Pre(p2,M<<1);
    ntt[2].Pre(p3,M<<1);
    Pre(M);
    for(int i=0;i<M;i++) a[i]=inv[i+1];
    Inv(a,b,M);
    for(int i=0;i<M;i++) b[i]=1LL*b[i]*fac[i]%P;
    b[1]=P-b[1];
    rea(t);
    while(t--){
        rea(n); rea(k); n%=P;
        int ans=0;
        for(int i=k,prod=n;~i;prod=1LL*prod*n%P,i--)
            ans=(1LL*prod*b[i]%P*C(k+1,i)%P+ans)%P;
        ans=1LL*ans*Pow(k+1,P-2,P)%P;
        printf("%d\n",ans);
    }
    return 0;
}
ROS2实战:手把手教你用CMake集成自定义DDS(以CycloneDDS为例) 本文详细介绍了如何在ROS2中通过CMake集成自定义DDS(以CycloneDDS为例),涵盖环境准备、源码编译、ROS2工作区集成、性能调优及常见问题排查。通过RMW中间件抽象层,开发者可以灵活切换DDS实现,提升系统实时性和可靠性。 阅读详情

相关推荐

Quartus ||———基于Verilog HDL的数字秒表设计实验

Quartus ||———基于Verilog HDL的数字秒表设计实验一、实验目的二、实验步骤(一)新建工程(二)添加设计文件(三)综合分析与功能仿真1、综合分析2、功能仿真 一、实验目的 用Verilog HDL设计一个数字跑表,所需引脚和功能如下: 二、实验步骤 (一)新建工程 在创建好工程名称后,选定芯片类型 (二)添加设计文件 新建Verilog文件,键入代码如下 module n_clk_top( input clk, input rese

TBMmagic的博客 5525

伯努利数、欧拉数与泰勒展开式

伯努利数和正切函数泰勒展开式1.伯努利数2.三角函数泰勒展开式3.双曲三角函数展开式4.自然幂指数和5. 程序应用与计算参考 1.伯努利数 伯努利数是十八世纪瑞士数学家雅各布·伯努利引入的一个数。伯努利数是一个有理数数列。一般地有两种定义的方法: 生成函数定义方法 设伯努利数列为BnB_{n}Bn​,定义复变函数 f(z)=zez−1=∑n=0∞Bnznn!f(z)=\frac{z}{e^{z}-1}=\sum\limits_{n=0}^{\infty}B_{n}\frac{z^{n}}{n!}f(z)=e

MobtgZhang的博客 6910

从零到一:Halcon手眼标定的实战避坑指南

本文详细解析了Halcon手眼标定的完整流程,重点介绍了Eye-in-Hand和Eye-to-Hand两种模式的实操技巧与常见陷阱。通过九点法、N点法等实战案例,提供硬件配置检查、数据采集策略及误差修正方案,帮助开发者提升机械臂与视觉系统的协同精度,适用于工业自动化领域的精准定位与抓取任务。

neovim7hacker的博客 234

任意模数NTT(三模数NTT)

### 介绍 一般的NTT的模数$P$都要满足$P=r\times 2^k+1$。但如果不满足这个条件,那就不能直接用NTT了,需要用到任意模数NTT。 下面就来介绍一种任意模数NTT——三模数NTT。

tanjunming2020的博客 1231

Oracle EBS R12 AP模块发票导入接口实战:从SQL插入到API调用的完整流程

本文详细解析了Oracle EBS R12 AP模块发票导入接口的完整流程,从SQL插入到API调用的实战技巧。涵盖接口表设计、数据验证、双通道导入机制及错误诊断,特别分享官方文档未提及的高阶优化方案,助力企业实现财务数字化转型。

weixin_33728268的博客 475

比亚迪唐/秦开发者必看:253个车辆接口实战指南(附常用功能调用示例)

本文为比亚迪唐/秦开发者提供了一份详尽的车辆接口实战指南。文章聚焦于比亚迪开放的253个车辆接口,从开发环境搭建、核心状态监控到高频控制功能(如空调与充电管理),结合真实代码示例,帮助开发者快速上手并规避常见问题,高效开发车载应用。

weixin_28327051的博客 604

任意模数NTT(MTT)

前言 众所周知,NTT有几个经典的模数:469762049,998244353,1004535809469762049,998244353,1004535809469762049,998244353,1004535809 为什么这些模数被称为NTT模数呢?因为他们都是这样一个形式: P=2a∗X+1P=2^a*X+1P=2a∗X+1 为什么要有这样一个条件呢,因为只有这样,才能找到所需的原根 所以...

zhouyuheng2003的博客 9180

从412到200:一步步拆解瑞数6代jsvmp的cookie生成与验证流程

本文深入解析瑞数6代JSVMP的动态安全防护机制,详细拆解从412到200状态的cookie生成与验证流程。通过剖析JSVMP虚拟机核心机制、动态元数据解析及环境检测绕过策略,为逆向工程师提供实用的技术解决方案,帮助突破瑞数6代的高级防御体系。

weixin_30342209的博客 508

8.14.10 ACM-ICPC 组合数学 伯努利数

伯努利数 BnB_nBn​ 是通过下面的递推公式定义的:其中 (n+1k)\binom{n+1}{k}(kn+1​) 是二项式系数。伯努利数在组合数学中具有重要地位,其广泛应用于数论、高次求和、欧拉-麦克劳林公式以及组合计数问题中。掌握伯努利数的性质和计算方法,对于解决 ACM-ICPC 编程竞赛中的复杂数学问题具有重要意义。通过以上内容的学习和代码实现,读者可以更好地理解和应用伯努利数。伯努利数在组合数学中占有重要地位,其应用范围包括高次求和、欧拉-麦克劳林公式、组合计数等。

tang7mj的博客 1629

更换光猫的原理与方法

当你给装维打电话说你需要更换光猫时,对于装维来说,他并不需要知道怎么更换,他只需要生成一张工单,由后台进行业务操作后,在去用户家把新光猫给装好即可,此时装维到底起到了什么作用呢?我想可能只是运输员吧,把一个设备从一个地方运到另一个地方罢了,此时并不能指望装维做什么,因为本质上来说装维的能力真的很差很差,我是不知道那些装维哪来的勇气做视频,还说自己什么什么能力很强?很强吗?吹牛的技术确实很强。 更换光猫之前,需要先明白为什么要更换光猫,怎么更换光猫,更换后不能用怎么办?怎么才能更换成功,换光猫以后被限速了怎么

qq_34146290的博客 1万+

RAP BDL 里的 field ( readonly ) 到底控制了什么?——从语法到运行时的全景解析

RAP行为定义中的只读字段控制 摘要:该代码片段展示的是RAP(ABAP RESTful Application Programming)行为定义语言(BDL)中的字段控制语法,用于声明业务对象中需由框架自动维护的只读字段。field ( readonly )语句将订单ID和审计字段(CreatedBy/CreatedAt等)标记为只读,确保这些字段在更新阶段不可修改。在managed场景下,RAP框架会自动处理这些行政性数据的写入:创建时填充创建信息,更新时刷新变更记录,并利用LocalLastChang

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 154

[伯努利数] 51Nod 1258 序列求和 V4

自然数幂和的求法有很多 大概有 由二项式定理得递推式 拉格朗日插值法&牛顿插值法 第一类斯特林数 伯努利数 wiki传送门 ACdreamer的blog伯努利数有两种B+B^+和B−B^- 唯一的争议就在B1B_1上 因为 对于n>1n>1有B2n+1=0B_{2n+1}=0 其实这不是什么大问题 一般个人习惯用B−B^- 以下不注明BB都表示B−B^-然后我就只会伯努利数最裸的应用了

雯舞 2357

Allegro如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层

在Allegro做PCB设计的时候,如果需要复制器件的位号到其它层是无法直接实现的,如果直接拷贝器件的位号的话,效果如下。但是Allegro的Cross Copy命令是支持复制任何属性的图形到其它层的,下面以复制器件位号和丝印外框为例说明。同样如果使用Z-copy命令,也是无法Z-copy text的,Finds下方texts是灰色的。如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层。另外cap处可以选择线段的端点是圆形,八角形,或者方形的铜皮。拷贝C1013,出现的是C*

weixin_54787054的博客 2671

51nod 1258:序列求和 V4(伯努利数+多项式求逆+NTT+CRT)

题面 题意:求Sk(n)S_k(n) n≤1e18,k≤5e4。 用多项式逆元求出伯努利数,代公式就可以了。 上维基查了下伯努利数,B+B^+与B−B^-的差别只是B1B_1的正负而已. 但我依然不知道什么时候用哪个,两个都试一下,发现这题用B+B^+。 所以我做这题是为了学CRT的。 假设题意要求模P,三模数为p1,p2,p3。 我起初还天真地以为可以算出分别模p1,p2,p3的

KKiseki的博客 512

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]

1258 序列求和 V4 题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50000\) 等幂求和 多项式求逆元\(O(mlogm)\)预处理伯努利数,然后可以\(O(m)\)回答 因为是任意模数,所以要用拆系数fft 拆系数fft+多项式求逆元,写的爽死了 具体内容可能会写...

weixin_34126557的博客 140

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

51nod 1258 序列求和 V4

跪烂(貌似我记得,是我要学习多项式的一些东西,然后发现可以搞伯努利数,然后就奇怪的入坑了) 这个题显然是不可以n^2来预处理伯努利数的 那怎么办呢。。。。。。。。找题解啊。。。 这里有伯努利数的生成函数,(不知道怎么推的),然后搞一搞就成了一个多项式求逆的样子。 而且这个题还有一个BT的就是,1e9+7是不能写成1+2^k*n的形式的,所以就没有办法直接NTT,这里还要用到一个三模数NTT...

weixin_30432579的博客 108

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

伯努利数简单学习笔记

伯努利数 【百度百科:里面有很多应用】 定义与公式 我们常用BiB_iBi​定义第iii个伯努利数。 生成函数定义方式: zez−1=∑n=0∞Bnznn! \frac{z}{e^z-1}=\sum\limits_{n=0}^\infty B_n\frac{z^n}{n!} ez−1z​=n=0∑∞​Bn​n!zn​ 这里的z∈Cz\in Cz∈...

weixin_30815427的博客 489

数学板块学习之伯努利数

伯努利数 生成函数定义方式 O(nlogn)O(nlogn)O(nlogn)求伯努利数 BiB_iBi​为伯努利数数列 其生成函数是B(x)=∑i=0Bixii!=xex−1B(x)=\displaystyle\sum_{i=0}B_i\cfrac{x^i}{i!}=\cfrac{x}{e^x-1}B(x)=i=0∑​Bi​i!xi​=ex−1x​ 特殊的,当B1=12B_1=\cfrac{1}{...

Tan_JX 1087

【学习笔记】伯努利数

似乎是一篇又水又没啥用的博客。

cqbzlydd的博客 1739

伯努利数与自然数幂和

伯努利数与自然数幂和

weixin_45771864的博客 1013

伯努利数——详解

伯努利数是一个与数论有密切关联的有理数序列。

w_w_wwwww的博客 799

伯努利(Bernoulli)数学习笔记

伯努利数的指数型生成函数为B(x)=∑i=0Bii!xi=xex−1B(x)=\sum_{i=0} \frac{B_i}{i!} x^i=\frac{x}{e^x-1}B(x)=∑i=0​i!Bi​​xi=ex−1x​ 由此可得B0=1,B1=−12,B3=16,B4=0,B5=130...B_0=1,B_1=-\frac{1}{2},B_3=\frac{1}{6},B_4=0,B_5=\frac...

litble的成(tui)长(fei)史 1931

从零开始的伯努利数

伯努利数的坑太多了,目前正全力整合 基础部分已经填完了。 伯努利数 通常情况下指第一类伯努利数\(B^-\),递推式为 \[ B_0=1,\sum_{i=0}^n\binom{n+1}{i}B_i=0(n\ge1) \] 其前若干项为\(1,-\frac12,\frac16,0,-\frac1{30},0,\cdots\),发现对大于1的奇数\(n\)伯努利数\(B_n=0\)。 与第二类伯努...

weixin_30770495的博客 372

任意模数多项式乘法MTT(可拆系数FFT)详解

专门用来做毒瘤多项式乘法的算法。三模数NTT估计不会学了……

WerChange的OI博客 1569

任意模数FFT

任意模数FFT 这是一个神奇的魔法,但是和往常一样,在这之前,先 \(\texttt{orz}\ \color{orange}{\texttt{matthew99}}\) 问题描述 给定 2 个多项式 \(F(x), G(x)\) ,请求出 \(F(x) * G(x)\)。 系数对 p 取模,\(2 \le p \le 10^9+9\) 拆系数FFT 我们考虑令\(M\)为\(\sqrt...

araw94333的博客 499

伯努利数与自然数幂和推导

伯努利数 Ps.在本篇blogblogblog中[xn]F(x[xn]F(x[x^n]F(x)表示F(x)F(x)F(x)的第nnn项的系数。 定义 我们用生成函数法来定义伯努利数BnBnB_n xex−1=∑i≥0Bii!xixex−1=∑i≥0Bii!xi\frac{x}{e^x-1}=\sum_{i\geq0}\frac{B_i}{i!}x^i 换言之,就是xex−1xex−1\f...

XianHaoMing的博客 3098
上一篇: [BZOJ3625][Codeforces Round #250][多项式求逆][多项式开根]小朋友和二叉树
下一篇: [BZOJ3992] [SDOI2015] [NTT] 序列统计
LowestJN
博客等级 码龄10年 76粉丝 422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值