20181229

172.17.227.69

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
typedef long long LL;
using std::cin;
using std::cout;
using std::endl;

const int MAXN=100005;
int n,a[MAXN],f[MAXN][185],las[MAXN][10],maxa,maxans;
char s[MAXN];

int main(){
    freopen("cost.in","r",stdin);
    freopen("cost.out","w",stdout);
    scanf("%s",s+1);
    n=strlen(s+1);
    rin(i,1,n){
        a[i]=s[i]-'0';
        maxa=std::max(maxa,a[i]);
        rin(j,1,9){
            if(j==a[i]) las[i][j]=i;
            else las[i][j]=las[i-1][j];
        }
    }
    maxans=maxa*((int)log2(n)+1);
    rin(i,0,maxans) f[n+1][i]=n+1;
    rec(i,n,1){
        int j;
        for(j=0;j<a[i];j++) f[i][j]=i;
        for(j=a[i];;j++){
            int temp=i;
            rin(k,1,std::min(j,maxa)){
                int nxt=las[f[i][j-k]][k];
                if(nxt<i) continue;
                temp=std::max(temp,f[nxt+1][j-k]);
            }
            f[i][j]=temp;
            if(temp==n+1) break;
        }
        if(i==1){
            printf("%d\n",j);
            return 0;
        }
        for(;j<=maxans;j++) f[i][j]=n+1;
    }
}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
typedef long long LL;
using std::cin;
using std::cout;
using std::endl;

inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}

const int MAXN=10000005;
int n;
LL s,p,f[MAXN],g[MAXN];

int main(){
    freopen("suffix.in","r",stdin);
    freopen("suffix.out","w",stdout);
    n=read(),s=read(),p=read();
    g[1]=s;
    rin(i,2,n){
        f[i]=g[(i+1)>>1];
        g[i]=((g[i-1]*s-f[i])%p+p)%p;
    }
    printf("%lld\n",g[n]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ErkkiErkko/p/10197210.html