各种模板(数学数论字符串)

文章目录

  • 数学&数论
    • 线性求逆元
    • exgcd
    • excrt
    • FFT
    • NTT
    • 矩阵乘法
    • 线性筛素数
    • 杜教筛
  • 字符串
    • Trie
    • KMP
    • hash
    • Manacher
    • AC自动机
    • PAM
    • SAM
    • 广义SAM

数学&数论

线性求逆元

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 3001000
using namespace std;
ll n,p,q[N];
int main()
{scanf("%lld%lld",&n,&p);q[1]=1;for(ll i=2;i<=n;++i)q[i]=p-p/i*q[p%i]%p;return 0;
}

exgcd

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,p,x,y;
void exgcd(int a,int b,int &x,int &y)
{if(!b){x=1;y=0;return;}exgcd(b,a%b,x,y);int z=x;x=y;y=z-a/b*y;return;
}
int get(int a,int p)
{exgcd(a,p,x,y);return (x+p)%p;
}
int main()
{scanf("%d%d",&n,&p);for(int i=1;i<=n;++i)printf("%d\n",get(i,p));return 0;
}

excrt

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100100
using namespace std;
ll n,X,M,a[N],m[N];
ll ksc(ll x,ll y,ll wyc)
{return (x*y-(ll)((long double)x*y/wyc)*wyc+wyc)%wyc;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x=1;y=0;return a;}ll d=exgcd(b,a%b,x,y),z=x;x=y;y=z-a/b*y;return d;
}
void excrt()
{ll x,y;X=a[1],M=m[1];for(ll i=2;i<=n;++i){ll A=M,B=m[i],c=(a[i]-X%B+B)%B;ll d=exgcd(A,B,x,y);if(c%d){X=-1;return;}x=ksc(x,c/d,B/d);X+=x*M;M*=B/d;X=(X%M+M)%M;}return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;++i)scanf("%lld%lld",&m[i],&a[i]);excrt();printf("%lld",X);return 0;
}

FFT

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 1000010
using namespace std;
const double Pi=acos(-1);
int n,m,r[N<<2];
struct CP
{CP(double xx=0,double yy=0){x=xx,y=yy;}double x,y;CP operator +(CP const &b)const{return CP(x+b.x,y+b.y);}CP operator -(CP const &b)const{return CP(x-b.x,y-b.y);}CP operator *(CP const &b)const{return CP(x*b.x-y*b.y,x*b.y+y*b.x);}
}f[N<<2],g[N<<2];
void fft(CP *f,int flag)
{for(int i=0;i<n;++i)if(i<r[i])swap(f[i],f[r[i]]);for(int p=2;p<=n;p<<=1){int len=p>>1;CP G(cos(2*Pi/p),sin(2*Pi/p)*flag);for(int k=0;k<n;k+=p){CP buf(1,0);for(int i=k;i<k+len;++i){CP g=buf*f[i+len];f[i+len]=f[i]-g;f[i]=f[i]+g;buf=buf*G;}}}return;
}
int main()
{scanf("%d%d",&n,&m);n++,m++;for(int i=0;i<n;++i)scanf("%lf",&f[i].x);for(int i=0;i<m;++i)scanf("%lf",&g[i].x);for(m+=n,n=1;n<m;n<<=1);for(int i=0;i<n;++i)r[i]=(r[i>>1]>>1)|(i&1?n>>1:0);fft(f,1);fft(g,1);for(int i=0;i<n;++i)f[i]=f[i]*g[i];fft(f,-1);for(int i=0;i<=m-2;++i)printf("%d ",(int)(f[i].x/n+0.5));return 0;
}

NTT

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define clr(f,n) memset(f,0,sizeof(long long)*(n))
#define cpy(f,g,n) memcpy(f,g,sizeof(long long)*(n))
#define rev(f,n) reverse(f,f+n)
#define N 132000
#define mod 998244353 
using namespace std;
ll n,m,G,invG,f[N<<1],g[N<<1],tr[N<<1],inv[N<<1];
ll pw(ll x,ll y)
{ll z=1;while(y){if(y&1)z=z*x%mod;x=x*x%mod;y>>=1;}return z;
}
void tpre(ll n)
{for(ll i=0;i<n;++i)tr[i]=(tr[i>>1]>>1)|((i&1)?(n>>1):0);return;
}
void get_Dao(ll *f,ll *g,ll n)
{for(ll i=1;i<n;++i)f[i-1]=g[i]*i%mod;f[n-1]=0;return;
}
void get_jf(ll *f,ll *g,ll n)
{for(ll i=1;i<n;++i)f[i]=g[i-1]*inv[i]%mod;f[0]=0;return;
}
void ntt(ll *f,ll flag,ll m)
{int n;for(n=1;n<m;n<<=1);tpre(n);for(ll i=0;i<n;++i)if(tr[i]<i)swap(f[i],f[tr[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1,tG=pw(flag?G:invG,(mod-1)/p);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+len;++i){ll tt=buf*f[i+len]%mod;f[i+len]=(f[i]-tt+mod)%mod;f[i]=(f[i]+tt)%mod;buf=buf*tG%mod;}}}if(flag)return;ll invn=pw(n,mod-2);for(ll i=0;i<n;++i)f[i]=f[i]*invn%mod;return;
}
void px(ll *f,ll *g,ll n)
{for(ll i=0;i<n;++i)f[i]=f[i]*g[i]%mod;return;
}
void times(ll *f,ll *g,ll len,ll lim)
{int n;for(n=1;n<len+len;n<<=1);static ll sav[N<<1];cpy(sav,g,n);clr(sav+len,n-len);ntt(f,1,n);ntt(sav,1,n);px(f,sav,n);ntt(f,0,n);clr(f+lim,n-lim);return;
}
void get_inv(ll *f,ll *g,ll m)
{ll n;for(n=1;n<m;n<<=1);static ll r[N<<1],w[N<<1],sav[N<<1];w[0]=pw(g[0],mod-2);for(ll len=2;len<=n;len<<=1){for(ll i=0;i<(len>>1);++i)r[i]=(w[i]<<1)%mod;cpy(sav,g,len);ntt(w,1,len<<1);ntt(sav,1,len<<1);px(w,w,len<<1);px(w,sav,len<<1);ntt(w,0,len<<1);clr(w+len,len);for(ll i=0;i<len;++i)w[i]=(r[i]-w[i]+mod)%mod;}cpy(f,w,m);clr(r,n+n);clr(w,n+n);clr(sav,n+n);return;
}
void get_ln(ll *f,ll *g,ll n)
{static ll d[N<<1],sav[N<<1];get_Dao(d,g,n);get_inv(sav,g,n);times(d,sav,n,n);get_jf(f,d,n);ll m;for(m=n,n=1;n<m;n<<=1);clr(d,n+n);clr(sav,n+n);
}
void get_exp(ll *f,ll *g,ll m)
{ll n;for(n=1;n<m;n<<=1);static ll w[N<<1],sav[N<<1];w[0]=1;for(ll len=2;len<=n;len<<=1){get_ln(sav,w,len);for(ll i=0;i<len;++i)sav[i]=(g[i]-sav[i]+mod)%mod;sav[0]=(sav[0]+1)%mod;times(w,sav,len,len);}cpy(f,w,m);clr(w,n+n);clr(sav,n+n);return;
}
void get_sqrt(ll *f,ll *g,ll m)
{ll n;for(n=1;n<m;n<<=1);static ll w[N<<1],sav[N<<1];w[0]=1;for(ll len=2;len<=n;len<<=1){for(ll i=0;i<(len>>1);++i)sav[i]=w[i]*2%mod;get_inv(sav,sav,len);ntt(w,1,len);px(w,w,len);ntt(w,0,len);for(ll i=0;i<len;++i)w[i]=(w[i]+g[i])%mod;times(w,sav,len,len);}cpy(f,w,m);clr(w,n+n);clr(sav,n+n);return;
}
void get_pw(ll *f,ll *g,ll n,ll k)
{k%=mod;static ll sav[N<<1];get_ln(sav,g,n);for(ll i=0;i<n;++i)sav[i]=sav[i]*k%mod;get_exp(f,sav,n);clr(sav,n);return;
}
void get_div(ll *f,ll *g,ll n,ll m)
{static ll s[N<<1],s1[N<<1];ll nm=n-m+1;rev(f,n);cpy(s,f,nm);rev(f,n);rev(g,m);cpy(s1,g,nm);rev(g,m);get_inv(s1,s1,nm);times(s1,s,nm,nm);rev(s1,nm);times(g,s1,n,n);for(ll i=0;i<m-1;++i)g[i]=(f[i]-g[i]+mod)%mod;cpy(f,s1,nm);clr(g+m-1,nm);clr(f+nm,n-nm);clr(s,n<<1);clr(s1,n<<1);return;
}
int main()
{G=3;invG=pw(3,mod-2);inv[1]=1;for(ll i=2;i<=(N-50)*2;++i)inv[i]=mod-mod/i*inv[mod%i]%mod;return 0;
}

矩阵乘法

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define wyc 1000000007
ll n;
struct matrix
{ll n, m, a[5][5];matrix operator *(const matrix b) const{matrix c;c.n = n;c.m = b.m;for (ll i = 1; i <= c.n; ++i)for (ll j = 1; j <= c.m; ++j)c.a[i][j] = 0;for (ll i = 1; i <= n; ++i)for (ll k = 1; k <= m; ++k)for (ll j = 1; j <= b.m; ++j)c.a[i][j] = (c.a[i][j] + a[i][k] * b.a[k][j] % wyc) % wyc;return c;}
}A, B;
void ksm(ll g)//快速幂
{while(g){if (g & 1) A = A * B;B = B * B;g>>=1;}
}
int main()
{scanf("%lld", &n);B.n = 2;B.m = 2;B.a[1][1] = 0;B.a[1][2] = 1;B.a[2][1] = 1;B.a[2][2] = 1;A.n = 1;A.m = 2;A.a[1][1] = 1;A.a[1][2] = 1;ksm(n - 1);printf("%lld", A.a[1][1]);return 0;
}

线性筛素数

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n, q, x, w, prime[6000000];
bool p[100000010];
void work(int n)
{for (int i = 2; i <= n; ++i){if (!p[i]) prime[++w] = i;for (int j = 1; j <= w && i * prime[j] <= n; ++j){p[i * prime[j]] = 1;if (i % prime[j] == 0) break;}}return;
}
int main()
{scanf("%d%d", &n, &q);work(n);for (int i = 1; i <= q; ++i){scanf("%d", &x);printf("%d\n", prime[x]);}return 0;
}

杜教筛

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define MXN 5000100
using namespace std;
ll T,N,w,smu[2010],sphi[2010],mu[MXN],phi[MXN],prime[MXN],p[MXN];
const ll MX=5000000;
void work()
{mu[1]=phi[1]=1;for(ll i=2;i<=MX;++i){if(!p[i]){prime[++w]=i;phi[i]=i-1;mu[i]=-1;}for(ll j=1;j<=w&&i*prime[j]<=MX;++j){p[i*prime[j]]=1;if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}else{mu[i*prime[j]]=-mu[i];phi[i*prime[j]]=phi[i]*(prime[j]-1);}}}for(ll i=2;i<=MX;++i)mu[i]+=mu[i-1],phi[i]+=phi[i-1];return;
}
ll get_mu(ll n)
{if(n<=MX)return mu[n];else return smu[N/n];
}
ll get_phi(ll n)
{if(n<=MX)return phi[n];else return sphi[N/n];
}
void S(ll n,ll d)
{if(n<=MX||sphi[d])return;smu[d]=1;sphi[d]=n*(n+1)/2;for(ll l=2,r=0;l<=n;l=r+1){r=n/(n/l);S(n/l,d*l);smu[d]-=get_mu(n/l)*(r-l+1);sphi[d]-=get_phi(n/l)*(r-l+1);}return;
}
int main()
{work();scanf("%lld",&T);while(T--){scanf("%lld",&N);memset(sphi,0,sizeof(sphi));S(N,1);printf("%lld %lld\n",get_phi(N),get_mu(N));}return 0;
}

字符串

Trie

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 1000100
using namespace std;
int n, m, w, a[N], to[N][30];
char s[N];
void insert(char* s)
{int n = strlen(s+1), x = 0, y;for (int i = 1; i <= n; ++i){y = s[i] - 'a';if (!to[x][y]) to[x][y] = ++w;x = to[x][y];}a[x]++;return;
}
int ask(char* s)
{int n = strlen(s+1), x = 0, y, ans = 0;for (int i = 1; i <= n; ++i){y = s[i] - 'a';if (to[x][y]) x = to[x][y];else return ans;ans += a[x];}return ans;
}
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i){scanf("%s", s+1);insert(s);}while(m--){scanf("%s", s+1);printf("%d\n", ask(s));}return 0;
}

KMP

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define N 1000100
using namespace std;
int nx[N];
char s[N], str[N];
void gnx(char* s) {int n = strlen(s + 1);for (int i = 2, j = 0; i <= n; ++i) {while (s[i] != s[j + 1] && j) j = nx[j];if (s[i] == s[j + 1])j++;nx[i] = j;}return;
}
int match(char* s, char* str) {int n = strlen(s + 1), m = strlen(str + 1), ans = 0;for (int i = 1, j = 0; i <= m; ++i) {while ((j == n || str[i] != s[j + 1]) && j) j = nx[j];if (str[i] == s[j + 1])j++;if (j == n)ans++;}return ans;
}
int main() {scanf("%s%s", str + 1, s + 1);gnx(s);printf("%d", match(s, str));return 0;
}

hash

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define ull unsigned long long
using namespace std;
int n, l, ans;
ull x[10010];
char s[1510];
int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++i){scanf("%s", s+1);l = strlen(s+1);for (int j = 1; j <= l; ++j)x[i] = x[i] * 131llu + s[j];}sort(x + 1, x + 1 + n);for (int i = 1; i <= n; ++i)if (x[i] != x[i - 1] || i == 1) ans++;printf("%d", ans);return 0;
}

Manacher

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 110000010
using namespace std;
int n, ans, l[N*2], s[N*2];
string str;
void Manacher()
{int mid = 0, mx = 0;for (int i = 1; i <= n; ++i){if (i < mx) l[i] = min(l[mid * 2 - i], mx - i);else l[i] = 1;while(s[i + l[i]] == s[i - l[i]]) l[i]++;if (i + l[i] > mx){mid = i;mx = i + l[i];}ans = max(ans, l[i]);}return;
}
int main()
{cin>>str;n = str.size();s[0] = s[1] = '#';for (int i = 1; i <= n; ++i){s[i * 2] = str[i - 1];s[i * 2 + 1] = '#';}n = n * 2 + 2;s[n] = 0;Manacher();printf("%d", ans - 1);return 0;
}

AC自动机

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 20100
using namespace std;
int n, w, ans, a[200], v[N], nx[N], to[N][30];
char s[200][100], ss[1000100];
queue<int>d;
void insert(char* s, int g)
{int n = strlen(s+1), now = 0, y;for (int i = 1; i <= n; ++i){y = s[i] - 'a';if (!to[now][y]) to[now][y] = ++w;now = to[now][y];}v[now] = g;return;
}
void bfs()
{for (int i = 0; i < 26; ++i)if (to[0][i]) d.push(to[0][i]);while(!d.empty()){int h = d.front();d.pop();for (int i = 0; i < 26; ++i)if (!to[h][i]) to[h][i] = to[nx[h]][i];else nx[to[h][i]] = to[nx[h]][i], d.push(to[h][i]);}return;
}
void ask(char* s)
{int n = strlen(s+1), now = 0, y, g;for (int i = 1; i <= n; ++i){y = s[i] - 'a';now = g = to[now][y];while(g){if (v[g]) a[v[g]]++;g = nx[g];}}return;
}
int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++i){scanf("%s", s[i]+1);insert(s[i], i);}bfs();scanf("%s", ss+1);ask(ss);for (int i = 1; i <= n; ++i)ans = max(ans, a[i]);printf("%d\n", ans);for (int i = 1; i <= n; ++i)if (a[i] == ans)printf("%s\n", s[i]+1);return 0;
}

PAM

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 500010
using namespace std;
int n,k,last;
char s[N];
struct PAM
{int nm,now,c[N],len[N],num[N],fail[N],to[N][30];void pre_work(){now=1;len[1]=-1;fail[0]=1;c[0]=-1;last=0;return;}int get_fail(int x){while(c[nm]!=c[nm-len[x]-1])x=fail[x];return x;}void add(int x){c[++nm]=x;int ls=get_fail(last);if(!to[ls][x]){len[++now]=len[ls]+2;fail[now]=to[get_fail(fail[ls])][x];to[ls][x]=now;num[now]=num[fail[now]]+1;}last=to[ls][x];}
}T;
int main()
{scanf("%s",s+1);n=strlen(s+1);T.pre_work();for(int i=1;i<=n;++i){s[i]=(s[i]-97+k)%26;T.add(s[i]);k=T.num[last];printf("%d ",k);}return 0;
}

SAM

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 1000100
using namespace std;
ll n,w,tot,lst,ans,h[N<<1],fa[N<<1],ch[N<<1][26],len[N<<1],num[N<<1];
char s[N];
struct rec
{ll to,nx;
}e[N<<1];
void add(ll c)
{ll p=lst,np=lst=++w;len[np]=len[p]+1;num[np]=1;while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];if(!p)fa[np]=1;else{ll q=ch[p][c];if(len[q]==len[p]+1)fa[np]=q;else{ll nq=++w;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q]));fa[nq]=fa[q];fa[q]=fa[np]=nq;while(p&&ch[p][c]==q)ch[p][c]=nq,p=fa[p];}}return;
}
void addl(ll x,ll y)
{e[++tot].to=y;e[tot].nx=h[x];h[x]=tot;return;
}
void dfs(ll x)
{for(ll i=h[x];i;i=e[i].nx){ll y=e[i].to;dfs(y);num[x]+=num[y];}if(num[x]>1)ans=max(ans,num[x]*len[x]);return;
}
int main()
{scanf("%s",s+1);n=strlen(s+1);lst=w=1;for(ll i=1;i<=n;++i)add(s[i]-'a');for(ll i=2;i<=w;++i)addl(fa[i],i);dfs(1);printf("%lld",ans);return 0;
}

广义SAM

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 1000100
using namespace std;
ll n,m,w,lst,ans,fa[N<<1],len[N<<1],ch[N<<1][30];
char s[N];
ll add(ll x,ll c)
{ll p=x;if(ch[p][c]){ll q=ch[p][c];if(len[q]==len[p]+1)return q;else{ll nq=++w;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q]));fa[nq]=fa[q];fa[q]=nq;while(ch[p][c]==q)ch[p][c]=nq,p=fa[p];return nq;}}ll np=++w;len[np]=len[p]+1;while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];if(!p)fa[np]=1;else{ll q=ch[p][c];if(len[q]==len[p]+1)fa[np]=q;else{ll nq=++w;len[nq]=len[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q]));fa[nq]=fa[q];fa[q]=fa[np]=nq;while(p&&ch[p][c]==q)ch[p][c]=nq,p=fa[p];}}return np;
}
int main()
{scanf("%lld",&n);w=1;for(ll i=1;i<=n;++i){scanf("%s",s+1);m=strlen(s+1);lst=1;for(ll i=1;i<=m;++i)lst=add(lst,s[i]-'a');}for(ll i=2;i<=w;++i)ans+=len[i]-len[fa[i]];printf("%lld",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习手记(2021/3/19~2022/8/25)

上一篇有点多就开新的了 文章目录树哈希wqswqswqs二分单位根反演威佐夫博弈范德蒙德行列式BEST定理平面图欧拉定理FWT转移矩阵的推导保序回归二分图最大团一些数学小结论范德蒙德卷积乘转加卷积斐波那契前缀和杜教筛μ\muμ单幂转下降幂下降幂X组合数多项式gcd无逆元求行列式&a…

【模板】最大流之上下界可行流

ACM模板 目录无源汇上下界可行流有源汇上下界最大流有源汇上下界最小流无源汇上下界可行流 问题&#xff1a; 给定一个网络&#xff0c;求一个流满足&#xff1a;每条边的流量处在给定的下界和上届[lower,upper]之间&#xff0c;满足流量守恒 首先我们在原网络中确定一个全部是…

Sangmado 公共基础类库

Sangmado&#xff08;发音 /sɔŋmɑːdu:/ ‘桑麻渡’&#xff09;涵盖了支撑 .NET/C# 项目开发的最基础的公共类库&#xff0c;为团队在不断的系统开发和演进过程中发现和积累的最公共的代码可复用单元。Sangmado 公共类库设计原则&#xff1a;独立性&#xff1a;不与任何业务…

牛客挑战赛48E-速度即转发【带修莫队,分块】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11161/E 题目大意 给出nnn个数字的一个序列&#xff0c;mmm个操作。 给出l,r,kl,r,kl,r,k&#xff0c;求一个最大的xxx使得∑ilrmax{ai−x,0}≥k\sum_{il}^rmax\{a_i-x,0\}\geq k∑ilr​max{ai​−x,0}≥k单点修改 解题思…

L2-002 链表去重

给定一个带整数键值的链表 L&#xff0c;你需要把其中绝对值重复的键值结点删掉。即对每个键值 K&#xff0c;只有第一个绝对值等于 K 的结点被保留。同时&#xff0c;所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15&#xff0c;你需要输出去重后…

【模板】卡特兰数

ACM模板 目录Catalan数证明卡特兰数应用Catalan数证明 1.卡特兰数递推式&#xff1a; an{1,n0∑i0n−1aian−1−i,n>0a_n\begin{cases} 1,n0\\\sum_{i0}^{n-1}a_ia_{n-1-i},n>0\end{cases} an​{1,n0∑i0n−1​ai​an−1−i​,n>0​ 2.卡特兰数组合数&#xff1a; an…

【活动(深圳)DevOps/.NET 微服务 秋季分享会】火热报名中!

无论身处开发还是运维岗位&#xff0c;您一定深刻地感受着业务需求带来的快速交付压力。在科技迅速发展的时代&#xff0c;传统行业积极开展数字化转型以在激烈竞争中脱颖而出&#xff0c;新兴行业不停歇地验证业务模式以找准市场定位&#xff1b;软件与行业变得密不可分&#…

P7443-加边【博弈论】

正题 题目链接:https://www.luogu.com.cn/problem/P7443?contestId41429 题目大意 nnn个点的一棵有根树&#xff0c;两个人从一号点开始进行有向图博弈。 告诉你Alice是先手还是后手&#xff0c;然后你可以选择加一条链接(u,v)(u,v)(u,v)的有向边&#xff0c;权值为AauBavA\…

L2-004 这是二叉搜索树吗?

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树&#xff1a;对于任一结点&#xff0c; 其左子树中所有结点的键值小于该结点的键值&#xff1b; 其右子树中所有结点的键值大于等于该结点的键值&#xff1b; 其左右子树都是二叉搜索树。 所谓二叉搜索树的“镜像”&#x…

【模板】序列自动机

ACM模板 目录构建序列自动机子序列查询构建序列自动机 ne[i][j]存的是在字符串 s 中第 iii 位后面第一个 j(0<j<26)j(0<j<26)j(0<j<26) 字母出现的位置。 void build(char s[]) {int nstrlen(s1);for(int in;i;i--){for(int j0;j<26;j)ne[i-1][j]ne[i][j]…

微软正式发布Azure IoT Central

微软正式发布Azure IoT Central&#xff0c;这是一个面向物联网的软件即服务解决方案。借助该服务&#xff0c;微软旨在提供一种设计、开发、配置和管理IoT设备的低代码方式&#xff0c;同时提供开箱即用的安全性、可伸缩性以及与流程&应用程序集成。Azure IoT Central构建…

ARC115E-LEQ and NEQ【容斥,dp,线段树】

正题 题目链接:https://atcoder.jp/contests/arc115/tasks/arc115_d 题目大意 nnn个数字的序列xxx&#xff0c;第xi∈[1,Ai]∩Zx_i\in [1,A_i]\cap Zxi​∈[1,Ai​]∩Z。要求相邻的不同&#xff0c;求方案数。 1≤n≤5105,1≤Ai≤1091\leq n\leq 5\times 10^5,1\leq A_i\leq 1…

点分治(树分治)

文章目录介绍&#xff1a;题目&#xff1a;做法&#xff1a;模板题 [P3806 【模板】点分治1](https://www.luogu.com.cn/problem/P3806)代码&#xff1a;介绍&#xff1a; 将原问题分解成若干相同形式&#xff0c;相互独立的子问题&#xff0c;各个击破 一般用来解决有关树上路…

【模板】KMP算法、fail树

ACM模板 目录KMP字符串Fail失配树KMP字符串 肖然大佬视频讲解 子串&#xff1a; 从原串中选取连续的一段&#xff0c;即为子串&#xff08;包括空串&#xff09; 前缀&#xff1a; pre(s,k)pre(s,k)pre(s,k) 为 s 前 k 个字符构成的子串 后缀&#xff1a; suf(s,k)suf(s,k)suf…

.NET Standard 2.1 公布

原文: Announcing .NET Standard 2.1校对: Cloud自从大约一年前发布 .NET Standard 2.0以来&#xff0c;我们已经向 .NET Core 2.1 发布了两个更新&#xff0c;并即将发布 .NET Core 2.2 。 现在是时候更新 Standard 了&#xff0c;包括一些新的概念以及一些小改进&#xff0c;…

CF708E-Student‘s Camp【数学期望,dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF708E 题目大意 有n∗mn*mn∗m的矩形网格&#xff0c;然后每次每行最左边和最右边的格子各有pcdp\frac{c}{d}pdc​的概率会消失&#xff0c;进行kkk次。 求最后所有格子依旧四联通的概率&#xff0c;在%(1097)\%(10^97)%(1…

P3806 【模板】点分治1

模板题 P3806 【模板】点分治1 题目描述 给定一棵有 n 个点的树&#xff0c;询问树上距离为 k 的点对是否存在。 详讲 关于点分治具体内容可以看这个 这里主要是详细讲讲代码&#xff1a; getrt是用来求重心&#xff0c;我们利用树型dp的思维来做&#xff0c;即找到该节点所…

ASP.NET Core中使用GraphQL - 第二章 中间件

前文&#xff1a;ASP.NET Core中使用GraphQL - 第一章 Hello World中间件如果你熟悉ASP.NET Core的中间件&#xff0c;你可能会注意到之前的博客中我们已经使用了一个中间件&#xff0c;这个中间件负责输出了当前查询的结果。中间件的定义&#xff1a;中间件是装载在应用程序管…

【模板】AC自动机

ACM模板 目录插入以及构建AC自动机【模板】AC自动机&#xff08;二次加强版&#xff09;ac自动机fail树上dfs序建可持久化线段树插入以及构建AC自动机 #include<queue> #include<string> const int N200010; struct node {int chd[26],fail,cnt; }tree[N]; void i…

ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

本系列相关文章&#xff1a;《ASP.NET Core中Ocelot的使用&#xff1a;API网关的应用》《ASP.NET Core中Ocelot的使用&#xff1a;基于Spring Clound Netflix Eureka的动态路由》本文将基于前两篇文章所述内容&#xff0c;继续介绍如何在服务发现和动态路由的基础上&#xff0c…