[説明] NOIP2014

\(\ D1 BF \)

\(\ BF T3 \) 飛ぶ鳥

SkyWTブログに話題がないアイデアQwQ、以降の計画を(ほとんどSkyWTを盗む!!!)DPを見つけることができます参照してください。

最も素朴なアイデアは、すべての位置は何回もジャンプアップしてから転送列挙することですが、この複雑さは高すぎます。だから我々はそれを見つけ、それは、バックパック、フル転送に類似することができ、ほぼ完全にバックパックのようです

コード

詳細は、あるいはそれについてのコードを置くために

Fショットの重要性に多くの時間、

void SOLVE(){
    rep(i,0,n)rep(j,0,m)f[i][j]=INF;
    rep(i,0,m)f[0][i]=0;
    rep(i,0,n-1){
        rep(j,1,m){
            int pos=min(m,j+a[i].x);
            if(j>a[i].l&&j<a[i].r)f[i+1][pos]=min(f[i+1][pos],f[i][j]+1);
            f[i+1][pos]=min(f[i+1][pos],f[i+1][j]+1);//可能j不合法,但是pos合法
        } //跳和不跳要分开,否则可能出现某一个位置既向下又向上的
        rep(j,a[i].y+1,m){
            if(j<=a[i].l||j>=a[i].r)continue;
            int pos=j-a[i].y;
            if(pos<=a[i+1].l||pos>=a[i+1].r)continue;
            f[i+1][pos]=min(f[i+1][pos],f[i][j]);
        }
        rep(j,1,m){
            if(j>a[i].l&&j<a[i].r)f[i][0]=min(f[i][0],f[i][j]);
        }
    }
    rep(i,1,m){
        if(i>a[n].l&&i<a[n].r)f[n][0]=min(f[n][0],f[n][i]);
    }
    rep(i,1,n){
        if(f[i][0]==INF){
            printf("0\n%d\n",cnt[i-1]);
            return;
        }
    }
    printf("1\n%d\n",f[n][0]);
    return;
}

\(\ BF D2 \)

T3の解決方程式

タイトル説明

分析

最初のための検討(X- \)\、どのように\(O(N)\)答え以内式上記で得られました:

原式\(F(X)= A_0 + X(A_1 + X(A_2 + X(..... + xa_n)))\)

しかし、データ範囲が大きすぎる、ハッシュを考慮してください。

プライムするための\(P \) もし\(F(X)\) \(P = 0 \) 次いで\(F(x)は\)ミスの可能性を低減するために、いくつかのより上で取ることができ、0であってもよいです素数

また、私たちはその見つかった\(F(X-)を\当量F(X- + P * I)(MOD P)\) 我々は列挙する必要があるので、(P \)\その上に数よりも少ないです

コード

#include<bits/stdc++.h>
#define rep(X,A,B) for(int X=A;X<=B;X++)
#define tep(X,A,B) for(int X=A;X>=B;X--)
#define LL long long
const int M=1000010;
const int N=110;
const int MX=5;
using namespace std;

int n,m;
int MOD[MX];
int a[N][MX];
int chk[M],ans[M];

int add(int x,int y,int z){return x+y>=MOD[z]?x+y-MOD[z]:x+y;}
int dec(int x,int y,int z){return x>=y?x-y:x+MOD[z]-y;}

void read(int id){
    char c=getchar();
    bool flg=0;
    for(;c<'0'||c>'9';c=getchar())flg|=(c=='-');
    for(;c>='0'&&c<='9';c=getchar()){
        rep(i,0,3)a[id][i]=add(a[id][i]*10%MOD[i],(c^48),i);
    }
    if(flg)a[id][4]=-1;else a[id][4]=1;
}

void READ(){
    MOD[0]=2333;MOD[1]=23333;MOD[2]=24547;MOD[3]=4111;
    scanf("%d%d",&n,&m);
    rep(i,0,n)read(i);
}

int CHK(int x,int z){
    int now=0;
    tep(i,n,0){
        if(a[i][4]==1)now=add(now*x%MOD[z],a[i][z],z);
        else now=dec(now*x%MOD[z],a[i][z],z);
    }
    return (now==0);
}

void SOLVE(){
    rep(o,0,3){
        rep(i,1,MOD[o]-1){
            if(i>m)break;
            if(CHK(i,o)){
                for(int now=i;now<=m;now+=MOD[o])chk[now]++;
            }
        }
    }
    int cnt=0;
    rep(i,1,m)if(chk[i]==4)ans[++cnt]=i;
    printf("%d\n",cnt);
    rep(i,1,cnt)printf("%d\n",ans[i]);
}

int main(){
    READ();
    SOLVE();
    return 0;
}

おすすめ

転載: www.cnblogs.com/SCL123/p/11839528.html