2018夏休み牛客多校(第3回)

9028 ワード

  • A-PACM Team
  • C-Shuffle Cards
  • H-Diff-prime Pairs

  • A-PACM Team
    https://www.nowcoder.com/acm/contest/141/A4次元の01リュックサックですが、パスを記録するだけで、勉強になりました~
    #include"bits/stdc++.h"
    #define out(x) cout<
    #define C(n,m) ((long long)fac[(n)]*inv[(m)]%MOD*inv[(n)-(m)]%MOD)
    using namespace std;
    typedef long long LL;
    const int maxn=37;
    short dp[maxn][maxn][maxn][maxn];
    bool vis[maxn][maxn][maxn][maxn][maxn];
    struct AAA 
    {
        int c[5],v;
    };
    AAA a[maxn];
    int C1,C2,C3,C4;
    void bag01(int n,AAA t)
    {
    
        int c1=t.c[1],c2=t.c[2],c3=t.c[3],c4=t.c[4],v=t.v;
        for(int i=C1;i>=c1;i--)
        {
            for(int j=C2;j>=c2;j--)
            {
                for(int k=C3;k>=c3;k--)
                {
                    for(int l=C4;l>=c4;l--)
                    {
                        if(dp[i][j][k][l]1;
                        }
                    }
                }
            }
        }
    }
    int main()
    {
        int N;
        cin>>N;
    
        for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=4;j++)cin>>a[i].c[j];
            cin>>a[i].v;
        }
        cin>>C1>>C2>>C3>>C4;
        memset(vis,0,sizeof vis);
    
        for(int i=1;i<=N;i++)
        {
            bag01(i,a[i]);
        }
        int cnt=0;
        int ans[maxn];
        memset(ans,0,sizeof(ans));
        for(int i=N,j=C1,k=C2,l=C3,m=C4;i>=1&&j>=0&&k>=0&&l>=0&&m>=0;i--)
        {
            if(vis[i][j][k][l][m])
            {
                j-=a[i].c[1];
                k-=a[i].c[2];
                l-=a[i].c[3];
                m-=a[i].c[4];
                ans[i]=1;
                cnt++;
                continue; 
            }
        }
        cout<for(int i=1;i<=N;i++)
        {
            if(ans[i])cout<1<<" ";
        }
        cout<

    C-Shuffle Cards
    ライブラリ関数があるなんて...
    #include"bits/stdc++.h"
    #include"ext/rope"
    #define out(x) cout<
    using namespace __gnu_cxx;
    using namespace std;
    typedef long long LL;
    const int maxn=1e6+5;
    rope<int>ro;
    int main()
    {
        int N,K;
        cin>>N>>K;
        for(int i=1;i<=N;i++)ro.append(i);
        while(K--)
        {
            int L,len;
            cin>>L>>len;
            L--;
            rope<int>tmp;
            tmp=ro.substr(L,len);
            ro.erase(L,len);
            ro.insert(0,tmp);
        }
        for(int i=0;iprintf("%d ",ro[i]);
        printf("
    "
    ); }

    H-Diff-prime Pairs
    https://www.nowcoder.com/acm/contest/141/Hこの問題...私たちのチームがまだ髪の毛をつかもうと悩んでいる間に、ymfは私に渡してくれと言って、結局、パチパチして、過ぎてしまいました.....彼はまだ一年生ですね...どうやって生きましょうか...
    标题:ymfの一言で思い出した~(2,3)(2,3)広ければ(4,6)(4,6)広ければ、(6,9)(6,9)広ければ、わあ~何か法則を見つけたようだ.gcd=1 g c d=1の2つの素数を探して、それから彼らの倍数も条件を満たして~最大倍数は何倍に達することができますか?N Nを一番大きいので割って、それからこの问题は终わります...
    #include"bits/stdc++.h"
    #define out(x) cout<
    using namespace std;
    typedef long long LL;
    const int maxn=1e7+5;
    vector<int> prime;
    bool vis[maxn];
    int cnt[maxn]; 
    void PRIME(int NN)
    {
        memset(vis,1,sizeof(vis));
        for(int i=2;i<=NN;i++)
        {
            if(vis[i])prime.push_back(i);
            for(int j=0;j0;
                if(i%prime[j]==0)break;
            }
            cnt[i]=prime.size();
        }
    }
    
    int main()
    {
        PRIME(maxn-5);
        int N;
        while(cin>>N)
        {
            LL ans=0;
            for(int i=2;i<=N;i++)
            {
                if(vis[i])
                {
                    ans+=(cnt[i]-1)*(N/i);
                }
            }
            cout<2<