Ganado la sesión de práctica de 60

Una buena suerte


Ideas: todos buscamos la suma de todos los números, por primera suma se calcula bajo el símbolo cuando \ (a_i \) j-bit es 1, la respuesta más una suma de bits j. La complejidad de O (nlogn)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10;
LL a[N];
long long bt[40],Pow[40];
int main(){
    int n;
    Pow[0]=1;
    for(int i=1;i<40;++i){
        Pow[i]=Pow[i-1]*2;
    }
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>a[i];
    }
    for(int i=1;i<=n;++i){
        int t=a[i];
        for(int i=0;i<40;++i){
            if(t%2) bt[i]++;
            t/=2;
        }
    }
    LL ans=0;
    for(int i=1;i<=n;++i){
        int t=a[i];
        for(int i=0;i<40;++i){
            if(t%2){
                ans+=Pow[i]*bt[i];
            }t/=2;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

Perímetro del triángulo y B


Idea: enumerar cada borde, una contribución borde a n-2 triángulos dentro.

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=998244353;
LL x[2010],y[2010];
LL dis(int i,int j){
    return (abs(x[i]-x[j])%mod+abs(y[i]-y[j])%mod)%mod;
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        long long ans=0;
        for(int i=1;i<=n;++i)
            scanf("%lld%lld",&x[i],&y[i]);
        for(int i=1;i<=n;++i){
            for(int j=i+1;j<=n;++j){
                ans=(ans+dis(i,j)%mod*(n-2)+mod)%mod;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

C aspectos operativos


Idea: Esta pregunta está tratando de ampliar la naturaleza de las sub-cadenas de diferente número de secuencia de problemas.
número sub-secuencia
para f [i] representa una naturaleza diferente antes de que el i-ésimo carácter puede estar compuesta de la secuencia, si a [i] representa el primer carácter aparece f [i] = f [i -1] + f [ i-1] 1, lo que indica que se aplica y f [i-1] detrás de diferentes secuencias de promotor y la formación de una nueva cadena en una sola; Si a [i] no es la primera vez, la posición de la primera ocurrencia de la última [a [i]], es F [i] = f [i -1] + f [i-1] -f [última [i-1]], lo que indica que se puede añadir a f [i-1] diferente secuencias promotoras detrás de la nueva cadena, pero la última [a [i] -1] secuencias tienen previamente y última [a [i]] de una composición.

#include<iostream>
#include<string.h>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<string>
#include<set>
#include<map>
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
const int N=1000010,mod=1e9+7;
int s[N];
LL f[N],last[N];
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;++i) scanf("%d",&s[i]);
        LL res=0;
        memset(last,-1,sizeof last);
        for(int i=1;i<=n;++i){
            int c=s[i];
            if(last[c]==-1)
                f[i]=f[i-1]*2+1;
            else f[i]=f[i-1]+f[i-1]-f[last[c]-1]+mod;
            f[i]%=mod;
            last[c]=i;
        }
        printf("%lld\n",f[n]);
    }
    return 0;
}

Esta pregunta es el número de secuencias requeridas para la grabación de un multi-estado, f [i, j] denota el frente i-ésimo longitud de caracteres puede estar compuesto de j

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
const int N=1e3+10;
long long f[N][N],last[30];
char str[N];
int main(){
    int n,k;
    cin>>n>>k;
    cin>>str+1;
    memset(last,-1,sizeof last);
    f[0][0]=1;
    for(int i=1;i<=n;++i){
        int c=str[i]-'a';
        f[i][0]=1;
        for(int j=1;j<=k&&j<=i;++j){
            if(last[c]==-1)
                f[i][j]=(f[i-1][j]+f[i-1][j-1])%mod;
            else
                f[i][j]=(f[i-1][j]+f[i-1][j-1]-f[last[c]-1][j-1]+mod)%mod;
        }
        last[c]=i;
    }
    cout<<f[n][k]<<endl;
    return 0;
}

Maestro cálculo línea decapitado


Pensando: solución A \ (A * X + B * Y + C * Z = K \) , se convierte en \ (T * GCD (A, B) + C * Z = K \) exgcd resueltos t, z, y luego convertido a \ (a * X + B * Y * KZ = C \) , aunque algunos de este problema tiene una solución, pero que resolver la ecuación 2, donde hay 2 * 2 tipos, todo lo que necesita para enumerar la primera cz ecuación calculados tres veces la producción en un momento dado pueden ser solucionable.

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){
    return b==0 ? a : gcd(b,a%b);
}
LL exGcd(LL &x,LL &y,LL a,LL b){
    if(b==0){
        x=1,y=0;
        return a;
    }
    LL GCD=exGcd(x,y,b,a%b);
    LL t=x;
    x=y;
    y=t-a/b*y;
    return GCD;
}
bool solve(LL a,LL b,LL c,LL k,int Case){
    LL gab=gcd(a,b);
    LL t,x,y,z;
    exGcd(t,z,gab,c);//gab*t+c*z=1
    LL gabc=gcd(gab,c);
    t*=(k/gabc);
    z*=(k/gabc);
    if(z<0) {
        LL tmp=(-z)/(gab/gabc);
        z+=gab/gabc*tmp;
        t-=c/gabc*tmp;
        if(z<0) z+=gab/gabc,t-=c/gabc;
    }
    if(t<0){
        LL tmp=(-t)/(c/gabc);
         z-=gab/gabc*tmp;
        t+=c/gabc*tmp;
        if(t<0) z-=gab/gabc,t+=c/gabc;
    }
    k-=z*c;
    exGcd(x,y,a,b);
    x*=(k/gab),y*=(k/gab);
    if(x<0){
        LL tmp=(-x)/(b/gab);
        x+=tmp*(b/gab);
        y-=a/gab*tmp;
        if(x<0) x+=(b/gab),y-=a/gab;
    }
    if(y<0){
        LL tmp=(-y)/(a/gab);
        x-=tmp*(b/gab);
        y+=a/gab*tmp;
        if(y<0) x-=(b/gab),y+=a/gab;
    }
    if(x>=0&&y>=0&&z>=0){
        if(Case==1)
            cout<<x<<" "<<y<<" "<<z<<endl;
        else if(Case==2)
            cout<<z<<" "<<y<<" "<<x<<endl;
        else cout<<x<<" "<<z<<" "<<y<<endl;
        return true;
    }
    else return false;
}
int main(){
    LL a,b,c,k;
    cin>>a>>b>>c>>k;
    if(solve(a,b,c,k,1)) return 0;
    if(solve(c,b,a,k,2)) return 0;
    if(solve(a,c,b,k,3)) return 0;
    return 0;
}
//234 2234 324 241520

Supongo que te gusta

Origin www.cnblogs.com/jjl0229/p/12587029.html
Recomendado
Clasificación