首页 > 其他分享 >一阶微分方程的常数变易法/洛谷P6613

一阶微分方程的常数变易法/洛谷P6613

时间:2024-01-18 20:58:03浏览次数:18  
标签:P6613 洛谷 int text ln dx 变易 aligned displaystyle

一阶微分方程的常数变易法

(1) 一阶齐次线性微分方程

\[\begin{aligned} F'(x)&=P(x)F(x)\\ \dfrac{1}{F(x)}\times F'(x)&=P(x)\\ (\ln F(x))'&=P(x)\\ \ln F(x)&=\int P(x) \text dx+\ln C\\ F(x)&= Ce^{\int P(x) \text dx}\\ \end{aligned}\]

(2) 一阶非齐次线性微分方程

\[F'(x)=P(x)F(x)+Q(x) \]

考虑拆成两个只与 \(P(x)\) 或 \(Q(x)\) 其中一个相关的方程,分别求解后代回去计算 \(F(x)\)。

设 \(F(x)=u(x)v(x)\)

\[\begin{aligned} u'(x)v(x)+u(x)v'(x)&=P(x)u(x)v(x)+Q(x)\\ u'(x)v(x)+u(x)(v'(x)-P(x)v(x))&=Q(x)\\ \end{aligned}\]

若 \(v'(x)-P(x)v(x)=0\) 就可以消掉 \(P(x)\) 求解了。由 (1) 得此时 \(v(x)=C_ve^{\int P(x) \text dx}\)。带入原方程

\[\begin{aligned} u'(x)v(x)&=Q(x)\\ u'(x)C_ve^{\int P(x) \text dx}&=Q(x)\\ u'(x)&=\dfrac{Q(x)}{C_ve^{\int P(x) \text dx}}\\ u(x)&=C_v^{-1}(\int Q(x)e^{-\int P(x) \text dx}\text dx+C_u)\\ \end{aligned}\]

\(\displaystyle\therefore F(x)=u(x)v(x)=(\int Q(x)e^{-\int P(x) \text dx}\text dx+C_u)e^{\int P(x) \text dx}\)

发现解的形式与对应齐次方程的解 $ F(x)= Ce^{\int P(x) \text dx}$ 相似,只是把常数 \(C\) 换成了关于 \(x\) 的多项式 \(\displaystyle C(x)=\int Q(x)e^{-\int P(x) \text dx}\text dx+C_u\)

所以可以得到微分方程的常数变易法:先解对应的齐次方程,将常数换为待定多项式后代回原方程求解。

(3) 一阶非线性微分方程

\[\frac{\text dF(x)}{\text dx} = A(x)\text e^{F(x)-1}+B(x) \]

考虑对应的齐次方程

\[\begin{aligned} \dfrac{\text dF(x)}{\text dx}&=A(x)e^{F(x)-1}\\ \int\dfrac{\text dF(x)}{e^{F(x)-1}}&=\int A(x)\text dx\\ -e^{1-F(x)}&=\int A(x)\text dx-C\\ 1-F(x)&=\ln(C-\int A(x)\text dx)\\ F(x)&=1-\ln(C-\int A(x)\text dx)\\ \end{aligned}\]

设原方程的解为 \(\displaystyle F(x)=1-\ln(C(x)-\int A(x)\text dx)\),代入得

\[\begin{aligned} (1-\ln(C(x)-\int A(x)\text dx))'&=\dfrac{A(x)}{\displaystyle C(x)-\int A(x)\text dx}+B(x)\\ -\dfrac{C'(x)-A(x)}{\displaystyle C(x)-\int A(x)\text dx}&=\dfrac{A(x)}{\displaystyle C(x)-\int A(x)\text dx}+B(x)\\ C'(x)&=-B(x)(C(x)-\int A(x)\text dx)\\ &=-B(x)C(x)+B(x)\int A(x)\text dx\\ \end{aligned}\]

由 (2)

\[\displaystyle C(x)=(\int (\int A(x)\text dx )B(x)e^{\int B(x) \text dx}\text dx+C_0)e^{-\int B(x) \text dx}\]

\(\therefore\)

\[\begin{aligned} F(x)&=1-\ln(C(x)-\int A(x)\text dx)\\ &=1-\ln((\int (\int A(x)\text dx)B(x)e^{\int B(x) \text dx}\text dx+C_0)e^{-\int B(x) \text dx}-\int A(x)\text dx)\\ &=1+\int B(x)\text dx-\ln(\int (\int A(x)\text dx)B(x)e^{\int B(x) \text dx}\text dx+C_0-\int A(x)\text dxe^{\int B(x) \text dx})\\ \end{aligned}\]

取 \(C_0=1\) 即可。

代码

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define clr(f,n) memset(f,0,sizeof(int)*(n))
#define cpy(f,g,n) memcpy(f,g,sizeof(int)*(n))
#define bceil(n) (1<<__lg(n-1)+1)
using namespace std;
const int siz=1<<18;char buf[siz],*p1=buf,*p2=buf,obuf[siz],*p3=obuf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,siz,stdin),p1==p2)?EOF:*p1++
#define putchar(x) (p3-obuf<siz)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)
int read(){
    int a=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9') a=(a<<3)+(a<<1)+(ch^'0'),ch=getchar();
    return a;
} 
void write(int a){
    if(a>9) write(a/10); 
    putchar(a%10+'0');
}
const int MAXN=1e6+10,P=998244353,G=3,Gi=332748118,Img=86583718;
int l,r[MAXN],inv[MAXN],sav[MAXN<<1];
ll qpow(ll a,ll b=P-2){
    if(a==1) return 1;
    ll ans=1;
    while(b){if(b&1) ans=ans*a%P;a=a*a%P;b>>=1;}
    return ans;
}
void tpre(int lim){
    if(l==lim) return;l=lim;
    for(int i=0;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)?lim>>1:0);
}
void px(int *A,int *B,int n){for(int i=0;i<n;i++) A[i]=1ll*A[i]*B[i]%P;} 
void NTT(int *A,int lim,int type){
    tpre(lim);
    static ull f[MAXN<<1],w[MAXN];w[0]=1;
    for(int i=0;i<lim;i++) f[i]=(((ll)P<<5)+A[r[i]])%P;
    for(int mid=1;mid<lim;mid<<=1){
        ull Wn=qpow(type+1?G:Gi,(P-1)/(mid+mid));
        for(int i=1;i<mid;i++)w[i]=w[i-1]*Wn%P;
        for(int j=0;j<lim;j+=mid+mid){
            for(int k=0;k<mid;k++){
                int x=w[k]*f[j|mid|k]%P;
                f[j|mid|k]=f[j|k]+P-x;
                f[j|k]+=x;
            }   
        }if(mid==(1<<10)){for(int i=0;i<lim;i++) f[i]%=P;}
    }if(type-1){
        ull inv=qpow(lim);
        for(int i=0;i<lim;i++) A[i]=f[i]%P*inv%P;
    }else for(int i=0;i<lim;i++) A[i]=f[i]%P;
}
void mul(int *A,int *B,int la,int lb){
    int lim=bceil(la+la);
    cpy(sav,B,lim);clr(sav+la,lim-la);
    NTT(A,lim,1);NTT(sav,lim,1);
    px(A,sav,lim);NTT(A,lim,-1);
    clr(A+lb,lim-lb);clr(sav,lim);
} 
void invp(int *A,int lim){
    int n=bceil(lim);
    static int w[MAXN<<1],r[MAXN<<1];
    w[0]=qpow(A[0]);
    for (int ln=2;ln<=n;ln<<=1){
        for(int i=0;i<(ln>>1);i++) r[i]=w[i];
        cpy(sav,A,ln);NTT(sav,ln,1);NTT(r,ln,1);px(r,sav,ln);
        NTT(r,ln,-1);clr(r,ln>>1);cpy(sav,w,ln);NTT(sav,ln,1);
        NTT(r,ln,1);px(r,sav,ln);NTT(r,ln,-1);
        for(int i=ln>>1;i<ln;i++) w[i]=(w[i]*2ll-r[i]+P)%P;
    }cpy(A,w,lim);clr(sav,n);clr(w,n);clr(r,n);
}
void deriv(int *A,int lim){
    for(int i=1;i<lim;i++) A[i-1]=1ll*A[i]*i%P;
    A[lim-1]=0;
}
void inv_init(int lim){
    inv[1]=1;
    for(int i=2;i<=lim;i++) inv[i]=1ll*inv[P%i]*(P-P/i)%P;
}
void integ(int *A,int lim){
    for(int i=lim;i;i--) A[i]=1ll*A[i-1]*inv[i]%P;
    A[0]=0;
}
void lnp(int *A,int lim){
    static int w[MAXN<<1];
    cpy(w,A,lim);
    invp(w,lim);deriv(A,lim);
    mul(A,w,lim,lim);
    integ(A,lim-1);
    clr(w,lim);
}
void exp(int *A,int lim){
    static int s[MAXN<<1],s2[MAXN<<1];
    int n=bceil(lim);
    s2[0]=1;
    for(int ln=2;ln<=n;ln<<=1){
        cpy(s,s2,ln>>1);lnp(s,ln);
        for(int i=0;i<ln;i++) s[i]=(A[i]-s[i]+P)%P;
        s[0]=(s[0]+1)%P;
        mul(s2,s,ln,ln);
    }cpy(A,s2,lim);clr(s,n);clr(s2,n);
}
int n,m,A[MAXN],B[MAXN],F[MAXN],s[MAXN];
int main(){
	n=read()+1;inv_init(n);
	for(int i=0;i<n;i++) A[i]=read();
	for(int i=0;i<n;i++) B[i]=read();
	integ(A,n);cpy(F,B,n);integ(F,n);
	cpy(s,F,n);exp(s,n);mul(s,A,n,n);
	mul(B,s,n,n);integ(B,n);B[0]++;
	for(int i=0;i<n;i++) B[i]=(B[i]-s[i]+P)%P;
	lnp(B,n);F[0]++;
	for(int i=0;i<n;i++) F[i]=(F[i]-B[i]+P)%P;
	for(int i=0;i<n;i++) write(F[i]),putchar(' ');
    fwrite(obuf,p3-obuf,1,stdout);
    return 0;
}

标签:P6613,洛谷,int,text,ln,dx,变易,aligned,displaystyle
From: https://www.cnblogs.com/ConvergentSeries/p/17973387

相关文章

  • 洛谷题单指南-模拟和高精度-P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
    原题链接:https://www.luogu.com.cn/problem/P1328题意解读:非常简单的一道题,核心考点就是循环数组以及评分规则的构建。评分规则:甲vs乙,1表示甲赢,-1表示甲输,-0表示平转化为数组:intrule[5][5]={0,-1,1,1,-1,1,0,-1,1,-1,-1,1,0,-1,1,-1,......
  • 洛谷题单指南-模拟和高精度-P4924 [1007] 魔法少女小Scarlet
    原题链接:https://www.luogu.com.cn/problem/P4924题意解读:根据题意,通过模拟法,枚举每一个要旋转的矩阵,执行旋转操作即可,关键点在于如何进行矩阵旋转。设定矩阵inta[][],临时矩阵intt[][]用于保存旋转后的矩阵,矩阵长度为len。先考虑要旋转的区域左上角是a[0][0]的情况,区域内每......
  • 洛谷P3045
    记\(d_i=P_i-C_i\),表示用优惠劵能优惠的钱数。最后会有一些牛用优惠劵买,有一些牛用原价买,那么用优惠劵买的牛的\(d\)一定大于用原价买的牛的\(d\),否则把这张优惠劵用来买原价的这头牛肯定更优。所以把所有牛按\(d\)排序后,一定可以找到一个分界点\(i\),使得\(i\)之前的牛......
  • 树形DP->没有上司的舞会(洛谷1352)
    题意:每个人有一个happ值,n个人,n-1条有向边,u是v的上司,求happy值最大。限制条件是u和v不能同时参加。分析:没想到一个v居然有很多上司,更没想到n-1条边居然是个森林。//没想到,一个员工居然可以有那么多上司。。voidsolve(){intn;cin>>n;vector<int>happy(n......
  • 洛谷题单指南-模拟和高精度-P1601 A+B Problem
    原题链接:https://www.luogu.com.cn/problem/P1601题意解读:本题是高精度加法的模版题。知识点解析:  高精度加法:  如果一个数大到远超过整形变量的范围时,就不能使用int、long、longlong等变量来存储整数,也不能直接通过变量加法来求和。  因此,需要回到加法计算的本质,从个......
  • 洛谷题单指南-模拟和高精度-P1563 [NOIP2016 提高组] 玩具谜题
    原题链接:https://www.luogu.com.cn/problem/P1563题意解读:本题关键在于根据小人的朝向和寻找的方向来确定数组下标的变化。用数组存储小人,intd[]存朝向,inta[]存名称,朝向和寻找方向有4种组合:朝向(0:向内,1:向外)  寻找方向(0:左,1:右)  数组下标操作00顺时针寻找,下标递减......
  • 洛谷 P8426 [JOI Open 2022] 放学路(School Road)
    洛谷传送门LOJ传送门考虑整个图是一个点双怎么做。显然如果有重边并且两条边边权一样就寄了。否则我们可以把它们当成一条边。考虑一个二度点\(u\)和与它相连的边\((v,u),(u,w)\)。我们可以把它缩成边\((v,w)\)。如果新边已经存在并且边权不等于这两条边边权就寄了。......
  • 洛谷题单指南-模拟和高精度-P1042 [NOIP2003 普及组] 乒乓球
    原题链接:https://www.luogu.com.cn/problem/P1042题意解读:分别针对11分制和21分制,输出每局比分。只需要判断一局的结束条件:得分高者如果达到11或者21,且比分间隔大于等于2分,则表示一局结束,可开始下一局,用模拟法即可解决。100分代码:#include<bits/stdc++.h>usingnamespaces......
  • 洛谷P10058 题解
    这种翻转的题明显已经做烂了好吧……首先显而易见,翻转偶数次对结果没有影响,只需要考虑奇数次翻转的情况。由于是整体移动的操作,可以抓住一个点来移动,然后还原出原来的序列。需要注意的是字符串是环形移动,因此如果当前点的位置大于字符串长度,要对字符串的长度进行取余操作。写......
  • 洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛 #7 &「RHOI」Round 2 赛后总结
    洛谷比赛【LGR-171-Div.3】深圳科创学院基础赛#7&「RHOI」Round2赛后总结比赛链接:https://www.luogu.com.cn/contest/146495建议先看原题再看文章。A-Water(P10056)有\(n\)个杯子,每个杯子的容积是\(a\),且初始装有\(b\)体积水。你可以进行任意次操作,每次操作选择任......