仓鼠的数学题,洛谷P3711,伯努利数简单应用

这篇博客介绍了如何使用快速傅里叶变换(FFT)进行多项式乘法。作者首先建议读者熟悉伯努利数,然后详细阐述了在计算关于x^i的系数时如何通过提公因式和逆元来简化计算。通过一系列的矩阵运算,作者展示了如何利用FFT高效地完成多项式乘法,并提供了一个C++实现的样例代码。该代码包括了预处理、多项式转换和快速傅里叶变换的步骤,最后给出了一个完整的计算过程。

正题

      如果不会伯努利数可以先看看本人的学习笔记

      然后给出来了式子就直接往上套,因为要求关于x^i的系数所以我们只能做0~x-1的自然数幂和,先把x^k单独提出来,最后再给每一项加上a_k即可.

      \\ \sum_{k=0}^n S(x-1,k)a_k \\ \sum_{k=0}^n a_k\frac{1}{k+1}\sum_{i=0}^kC_{k+1}^i B_i x^{k-i+1} \\ \sum_{k=0}^n a_k\frac{1}{k+1}\sum_{i=1}^{k+1}\frac{B_{k-i+1}}{(k-i+1)!}\frac{x^i}{i!} \\ \sum_{i=1}^{n+1} \frac{x^i}{i!}\sum_{k=i-1}^{n}\frac{B_{k-i+1}}{(k-i+1)!}\frac{a_k}{(k+1)!}

      显然最后一部分是一个翻转套路,然后求一遍FFT即可.

      

#include<bits/stdc++.h>
#define vi vector<int>
using namespace std;

int mod=998244353;
int ksm(int x,int t){
	int tot=1;
	while(t){
		if(t&1) tot=1ll*tot*x%mod;
		x=1ll*x*x%mod;
		t/=2;
	}
	return tot;
}
const int N=600010;//2<<18
int poor[2400010];
int fac[N],finv[N],n,limit,where[N];
int*w[2][19],*now=poor;

inline char nc()
{
    static const int BS = 1 << 22;
    static unsigned char buf[BS],*st,*ed;
    if(st == ed) ed = buf + fread(st=buf,1,BS,stdin);
    return st == ed ? EOF : *st++;
}
#define nc getchar
inline int read()
{
    char ch;
    int res = 0;
    while (!isdigit(ch = nc()));
    while (ch >= '0' and ch <= '9')
    {
        res = (res << 1) + (res << 3) + (ch - '0');
        ch = nc();
    }
    return res;
}


inline void write(int x){
	if (x < 0) x = ~x + 1, putchar('-');
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}

void pre(){
	fac[0]=1;for(int i=1;i<=600000;i++) fac[i]=1ll*fac[i-1]*i%mod;
	finv[600000]=ksm(fac[600000],mod-2);
	for(int i=599999;i>=0;i--) finv[i]=1ll*finv[i+1]*(i+1)%mod;
	for(int u=0,l=2;u<19;u++,l<<=1){
		w[1][u]=now;now+=l+1;
		w[0][u]=now;now+=l+1;
		w[1][u][0]=1;w[1][u][1]=ksm(3,(mod-1)/l);
		for(int i=2;i<=l;i++) w[1][u][i]=1ll*w[1][u][i-1]*w[1][u][1]%mod;
		for(int i=0;i<=l;i++) w[0][u][i]=w[1][u][l-i];
	}
}

void prepare(int n){
	int l=0;limit=1;
	while(limit<=n) limit<<=1,l++;
	for(int i=0;i<limit;i++) where[i]=((where[i>>1]>>1) | ((i&1)<<(l-1)));
}

void DFT(int*now,int op){
	int**w0=w[op];
	for(int i=0;i<limit;i++) if(i<where[i]) swap(now[i],now[where[i]]);
	for(int l=1,c=0;l<limit;l*=2,++c){
		for(int i=0;i<limit;i+=l+l){
			register int*s=now+i,*t=now+i+l,*w=w0[c];
			for(register int u=0;u<l;++u){
				register int b=1ll*t[u]*w[u]%mod;
				t[u]=(s[u]<b)?(s[u]-b+mod):(s[u]-b);
				s[u]=(s[u]+b>=mod)?(s[u]+b-mod):(s[u]+b);
			}
		}
	}
	if(!op){
		int tmp=ksm(limit,mod-2);
		for(int i=0;i<limit;i++) now[i]=1ll*now[i]*tmp%mod;
	}
}

void MUL(int*f,int*g,int n,int m){
	static int b[N];
	int tot=n+m-2;
	prepare(tot);
	for(int i=n;i<limit;i++) f[i]=0;
	for(int i=m;i<limit;i++) g[i]=0;
	for(int i=0;i<limit;i++) b[i]=g[i];
	DFT(f,1);DFT(b,1);
	for(int i=0;i<limit;i++) f[i]=1ll*f[i]*b[i]%mod;
	DFT(f,0);
}

void INV(int*f,int n){
	if(n==1) {f[0]=ksm(f[0],mod-2);return ;}
	int f0[n<<2];
	for(int i=0;i<(n+1)/2;i++) f0[i]=f[i];
	INV(f0,(n+1)/2);prepare(n+(n+1)/2*2-3);
	for(int i=n;i<limit;i++) f[i]=0;
	for(int i=(n+1)/2;i<limit;i++) f0[i]=0;
	DFT(f,1);DFT(f0,1);
	for(int i=0;i<limit;i++) f[i]=1ll*f0[i]*(mod+2-1ll*f[i]*f0[i]%mod)%mod;
	DFT(f,0);
}

int A[N],B[N],f[N],g[N];

int main(){
	//freopen("P3711_2.in","r",stdin);
	//freopen("ans.out","w",stdout);
	n=read();pre();
	for(int i=0;i<=n;i++) A[i]=B[i]=read(),A[i]=1ll*A[i]*fac[i]%mod;
	for(int i=0;i<=n;i++) f[i]=finv[i+1];
	INV(f,n+1);
	for(int i=0;i<=n/2;i++) swap(f[i],f[n-i]);
	MUL(f,A,n+1,n+1);write(B[0]);
	for(int i=1;i<=n+1;i++){
		putchar(' ');write((1ll*f[n+i-1]*finv[i]+B[i])%mod);
	}
}

 

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值