模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
/*对拍
@echo off
:loop
数据.exe 
a.exe
b.exe
fc a.out b.out
if not errorlevel 1 goto loop
pause
goto loop
*/
int read(){//读入优化
    int ans=0,f=1;char ret=getchar();
    while(ret>'9'||ret<'0')  f=(ret=='-')?-1:1,ret=getchar();
    while(ret<='9'&&ret>='0') ans=(ans<<1)+(ans<<3)+ret-'0',ret=getchar();
    return ans;
}
int fastpow(int x,int k,int p){//快速幂 
    int ans=1;
    while(k){
        ans=(1ll*ans*(k&1)?a:1)%p;
        a=1ll*a*a%p;
        k>>=1;
    }
    return ans;
}
int gcd(int a,int b){//最大公约数 
    if(!b) return a;
    if(f[a][b]) return f[a][b];
    return f[a][b]=gcd(b,a%b);
}
int fmny(int x,int p){//费马小定理求逆元,p与x互质 
    return fastpow(x,p-2,p);
} 
int exgcd(int &x,int &y,int a,int b){//扩展欧几里得 求逆元 
    if(!b) {
        x=1,y=0;
        return a;
    }
    int ret=gcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-a/b*y;
    return ret;
}
void prepare(){//素数线性筛+欧拉线性筛 
    phy[1]=1;ip[1]=1;
    for(int i=2;i<=10000000;i++){
        if(!ip[i]){
            pr[++tot]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=tot&&i*pr[j]<=10000000;j++){
            ip[pr[j]*i]=1;
            int s=0;
            if(i%pr[j]) s=1;
            phy[i*pr[j]]=phy[i]*(pr[j]-s);
            if(!s) break;
        }
    }
} //数论 
void add(int x,int y,int z){ //邻接链表 
    nex[++tot]=head[x];
    to[tot]=y;
    cos[tot]=z;
    head[x]=tot;
}
void floyed(){ //弗洛伊德 O(n^3)求多源最短路 
    for(int k=1;k<=n;k++)
     for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
    if(i!=j&&j!=k&&i!=k) 
    dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
} 
void spfa(){ //spfa O(N*K)求单源最短路 
    while(!q.empty()){
        int x=q.front();q.pop();vis[x]=0;
        for(int i=head[x];i;i=nex[i]){
            int tmp=to[i];
            if(dis[tmp]>dis[x]+cos[i]){
                dis[tmp]=dis[x]+cos[i];
                if(!vis[tmp]) vis[tmp]=1,q.push(tmp);
            }
        }
    }
} 
void dijsitla(){
    for(int i=1;i<=n;i++){
        node t=q.top();
        q.pop();

    }
}
void tarjan(int x){
    dfn[x]=++cnt;
    low[x]=cnt;
    for(int head[x];)
}
void sort(int l,int r){//归并排序 
    if(l==r) return;
    int mid=(l+r)>>1;
    sort(l,mid);
    sort(mid+1,r);
    int t1=l,t2=mid+1,tot=l;
    for(;tot<=r;){
        if((a[t1]<=a[t2]&&t1<=mid)||t2>r) tmp[tot++]=a[t1++];
        else if(t1>mid||(a[t2]<a[t1]&&t2<=r))tmp[tot++]=a[t2++];

    }
    for(int i=l;i<=r;i++) a[i]=tmp[i];
}
int main(){

} 

数状数组模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,m,x,y,b[1100000],opt;
void add(int i,int k){
    for(;i<=n;i+=i&-i)
    b[i]+=k;
}
int ask(int i){
    int ans=0;
    for(;i;i-=i&-i)
    ans+=b[i];
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&x),add(i,x);
    while(m--){
        scanf("%d%d%d",&opt,&x,&y);
        if(opt==1) add(x,y);
        else printf("%d\n",ask(y)-ask(x-1));
    }
}

RMQ模板st表

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,m,st[110000][21],l,r;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&st[i][0]);
    for(int k=1;(1<<k)<=n;k++)
    for(int i=1;i<=n;i++)
    if(i+(1<<k-1)<=n)
    st[i][k]=max(st[i][k-1],st[i+(1<<k-1)][k-1]);
    while(m--){
        scanf("%d%d",&l,&r);
        int ans=0;
        for(int k=20;k>=0;k--) 
        if(l+(1<<k)-1<=r) ans=max(ans,st[l][k]),l+=(1<<k);
        printf("%d\n",ans);
    }
}

线段树区间修改与查询模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
#define ll long long
using namespace std;
int n,m,l,r,opt;ll b[510000],k;
struct Node{
    ll s,add;
}tr[2100000];
void built(int o,int l,int r){
    if(l==r) scanf("%lld",&tr[o].s);
    else {
        int mid=(l+r)>>1;
        built(o<<1,l,mid);
        built(o<<1|1,mid+1,r);
        tr[o].s=tr[o<<1].s+tr[o<<1|1].s;
    }
}
void pushdown(int o,int len1,int len2){
    tr[o<<1].add+=tr[o].add;
    tr[o<<1|1].add+=tr[o].add;
    tr[o<<1].s+=tr[o].add*len1;
    tr[o<<1|1].s+=tr[o].add*len2;
    tr[o].add=0;
    return ;
}
void add(int o,int l,int r,int ql,int qr,ll ins){
    int mid=(l+r)>>1,len2=r-mid,len1=mid-l+1,len=r-l+1;
    if(l>qr||r<ql) return ;
    if(l>=ql&&r<=qr) {
        tr[o].add+=ins;
        tr[o].s+=ins*len;
        return ;
    }
    if(tr[o].add) pushdown(o,len1,len2);
    add(o<<1,l,mid,ql,qr,ins);
    add(o<<1|1,mid+1,r,ql,qr,ins);
    tr[o].s=tr[o<<1].s+tr[o<<1|1].s;
}
ll ask(int o,int l,int r,int ql,int qr){
    int mid=(l+r)>>1,len2=r-mid,len1=mid-l+1;
    if(l>qr||r<ql) return 0;
    if(l>=ql&&r<=qr) 
        return tr[o].s;
    if(tr[o].add) pushdown(o,len1,len2);
    return ask(o<<1,l,mid,ql,qr)+ask(o<<1|1,mid+1,r,ql,qr);
}
int main(){
    scanf("%d%d",&n,&m);
    built(1,1,n);
    while(m--){
        scanf("%d%d%d",&opt,&l,&r);
        if(opt==1) scanf("%lld",&k),add(1,1,n,l,r,k);
        else printf("%lld\n",ask(1,1,n,l,r));
    }
}

hash暴力匹配字符串

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
#define p 1000000009
using namespace std;
char a[1100000],b[1100000];
int pow[1100000],hasha[1100000],hashb,Next[1100000];
void getnext(char *b,int m,int *Next){
    int j=0; 
    for(int i=2;i<=m;i++){
        while(j&&b[i]!=b[j+1]) j=Next[j];
        if(b[i]==b[j+1]) j++;
        Next[i]=j;
    }
}
int main(){
    cin>>a+1>>b+1;
    int lena=strlen(a+1),lenb=strlen(b+1);
    pow[1]=1;
    for(int i=2;i<=max(lena,lenb);i++) pow[i]=1ll*pow[i-1]*29%p;
    for(int i=1;i<=lena;i++)
    hasha[i]=(1ll*hasha[i-1]*29+a[i]-'A')%p;
    for(int i=1;i<=lenb;i++) 
    hashb=(1ll*hashb*29+a[i]-'A')%p;
    for(int i=1;i+lenb-1<=lena;i++){
        int has=(1ll*hasha[i+lenb-1]-1ll*pow[lenb]*hasha[i]%p+p)%p;
        if(has==hashb) printf("%d\n",i); 
    }
    getnext(b,lenb,Next);
    for(int i=1;i<=lenb;i++) printf("%d ",Next[i]);
} 

kmp匹配字符串

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
#define p 1000000009
using namespace std;
char a[1100000],b[1100000];
int pow[1100000],hasha[1100000],hashb,Next[1100000];
void Get_next(char *b,int m,int *Next){
    int j=0; 
    for(int i=2;i<=m;i++){
        while(j&&b[i]!=b[j+1]) j=Next[j];
        if(b[i]==b[j+1]) j++;
        Next[i]=j;
    }
}
void KMP(char *a,char *b,int n,int m,int *Next){
    int j=0;
    for(int i=1;i<=n;i++){
        while(j&&a[i]!=b[j+1]) j=Next[j];
        if(a[i]==b[j+1]) j++;
        if(j==m) printf("%d\n",i-j+1),j=Next[j]; 
    }
}
int main(){
    cin>>a+1>>b+1;
    int lena=strlen(a+1),lenb=strlen(b+1);

    Get_next(b,lenb,Next);
    KMP(a,b,lena,lenb,Next);
    for(int i=1;i<=lenb;i++) printf("%d ",Next[i]);
} 

费马小定理求逆元模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,p;
int fastpow(int a,int k,int p){//快速幂 
    int ans=1;
    while(k){
        if(k&1) ans=1ll*ans*a%p;
        a=1ll*a*a%p;
        k>>=1;
    }
    return ans;
}
int fmny(int x,int p){//费马小定理求逆元,p与x互质 
    return fastpow(x,p-2,p);
} 
int main(){
    scanf("%d%d",&n,&p);

    for(int i=1;i<=n;i++)printf("%d\n",fmny(i,p)%p);

} 

递推求逆元模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,p;
int a[3000100];
int main(){
    scanf("%d%d",&n,&p);
    a[1]=1;
    for(int i=2;i<=n;i++){
        a[i]=(-1ll*(p/i)*a[p%i]%p+p)%p;
        printf("%d\n",a[i-1]);
    }
    printf("%d",(a[n]%p+p)%p);
} 

矩阵快速幂模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
#define p 1000000007
using namespace std;
int n,k,t;
struct st{
    int a[5][5];
    inline st operator *(const st &b)const{
        st ans;
        for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
        {
            ans.a[i][j]=0;
            for(int k=0;k<3;k++)
            ans.a[i][j]=(1ll*ans.a[i][j]+1ll*a[i][k]*b.a[k][j]%p)%p;
        }
        return ans;
    }
}q;
st fastpow(st a,int k){
    st ans=a;k--;
    while(k){
        if(k&1) ans=ans*a;
        a=a*a;
        k>>=1;
    }
    return ans;
}
int main(){
    scanf("%d",&t);
    q.a[0][0]=1;q.a[0][1]=1;q.a[0][2]=0;q.a[1][0]=0;q.a[1][1]=0;
    q.a[1][2]=1;q.a[2][0]=1;q.a[2][1]=0;q.a[2][2]=0;
    while(t--){
        scanf("%d",&n);
         if(n==1||n==2||n==3) {
        printf("1\n");
        continue;
        }
        st ans=fastpow(q,n-3);
        printf("%d\n",(1ll*ans.a[0][0]+1ll*ans.a[1][0]+1ll*ans.a[2][0])%1000000007);
    }

}

卢卡斯定理模板

#include<cstdio>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<cstdlib>
#include<algorithm>
int n,m,p,t,jc[110000];
using namespace std;
int fastpow(int a,int k,int p){//快速幂 
    int ans=1;
    while(k){
        if(k&1) ans=1ll*ans*a%p; 
        a=1ll*a*a%p;
        k>>=1;
    }
    return ans;
}
int c(int n,int m,int p){
    if(n<m) return 0;
    return 1ll*jc[n]*fastpow(jc[m],p-2,p)%p*fastpow(jc[n-m],p-2,p)%p;
}
int lucas(int n,int m,int p){

    return m==0?1:1ll*c(n%p,m%p,p)*lucas(n/p,m/p,p)%p;
}
int main(){
    scanf("%d",&t);


    while(t--){
        scanf("%d%d%d",&n,&m,&p);
        jc[0]=1;
        for(int i=1;i<=p;i++) jc[i]=1ll*jc[i-1]*i%p;
        printf("%d\n",lucas(n+m,m,p)%p);
    }
}
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值