2019頭の牛とより多くの乗客第五校

2019頭の牛とより多くの乗客第五校

A. digits2

0:47(+1)で解か

出席問題、\(N \)出力\(N \)回することができ、彼のチームメイトが何を考えているのか分かりません。

B.ジェネレータ1

upsolved

高速電力行列が、その数は非常に高く、

うまく高速パワーは、実際には小数に考え抜か。

C.ジェネレータ2

upsolved

BSGSは、ブロックのサイズを変更する必要があるので、下部の総複雑

E.独立したセット1

upsolved

ある((1 <= nのn \は <= 26)\) 図ポイント、最大独立各サブセットグラフQとどのくらい

\(2 ^ N \)に設けられ、成形圧力DP、\(DP [i]が\)を表し、点状態である(Iは\)\最大独立集合のサイズを設定(X \)\にある\(Iは\)最下位ビット\(1 \) 転送やすいので)、次いで、含まれていないいずれかの\を(1 \) つまり、\(DP [I-(X - << 1)] \) 又は含む\(1 \)を、そのされている(1 + DP [I-(X << 1)。 - (私は\&G [X])] \)\、ここで\(G [X]は\)を表し\(X \)圧力設定点に隣接するフォームを、いずれかの最大のように、メモリ制限ため、\(DP \)アレイ必要\(CHAR \)タイプ

#include <bits/stdc++.h>
using namespace std;

char f[1 << 26];
int g[26], n, m, x, y, ans;

int main() {
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; ++i) {
        scanf("%d%d", &x, &y);
        g[x] |= 1 << y;
        g[y] |= 1 << x;
    }
    f[0] = 0;
    for(int i = 1; i < (1 << n); ++i) {
        int x = __builtin_ffs(i) - 1;
        f[i] = max((int)f[i ^ (1 << x)], 1 + f[(i ^ (1 << x)) - (i & g[x])]);
        ans += f[i];
    }
    printf("%d\n", ans);
    return 0;
}

F.最大クリーク1

upsolved

\(N(1 <= N <= 5000)\) 右図は、各ビット位置の重み、二つの異なる右側の2つの点、二点目、それらがビンを指す場合にのみ、少なくとも二つの権利を有する場合最大出力と、プログラム群を求めて異なるビット

最大独立集合を見つけるために、補グラフが明らか場合は2点エッジとビット異なるがある場合のみ、明らかに二部グラフであり、図にその補数を考えます

G.サブシーケンス1

1時19分で解きます

2つの数値文字列\(S \) \(T \) もはやより\(3000 \) シーク\(S \)招くことなく\(0 \)デジタル比率としてサブのを\(T \ )プログラムの数が多いです

ノー大手の場合は\(0 \)よりもサブ\(のt \)長い、それは確かに比べて優れている\(のt \)算出した組み合わせの数が多いです

次のサブストリングと考える\(T \)であれば、設定された\(DP [I] [J ] \)は考慮表す\(S \)の前に\(Iは\)ビットが選択されている\(J \)ビット、およびよりも有している\(T \)の前に(J \)\大きな、プログラムの数、\を(DP2は、[I]は[J]が\である)、伝達方程式を容易に押し出すことができる同等のプログラム番号を表す(参照コード)、\ (DP [N-] [m]は\)に等しい長さ方式の数であります

#include <bits/stdc++.h>
using namespace std;

const int N = 3010, mod = 998244353;

int fac[N], invfac[N], ans, T, n, m;

int qp(int a, int n) {
    int res = 1;
    while(n) {
        if(n & 1)
            res = 1LL * res * a % mod;
        a = 1LL * a * a % mod;
        n >>= 1;
    }
    return res;
}

void init() {
    fac[0] = invfac[0] = 1;
    for(int i = 1; i < N; ++i) {
        fac[i] = 1LL * fac[i - 1] * i % mod;
        invfac[i] = qp(fac[i], mod - 2);
    }
}

int C(int n, int m) {
    return 1LL * fac[n] * invfac[n - m] % mod * invfac[m] % mod;
}


int dp[N][N], dp2[N][N];

char s[N], t[N];

int main() {
    init();
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d%s%s", &n, &m, s + 1, t + 1);
        ans = 0;
        for(int i = 0; i <= n; ++i) {
            for(int j = 0; j <= m; ++j) dp[i][j] = dp2[i][j] = 0;
            dp2[i][0] = 1;
        }
        for(int i = 1; i <= n; ++i) {
            if(s[i] == '0') continue;
            for(int j = n - i; j >= m; --j) {
                ans = (ans + C(n - i, j)) % mod;
            }
        }
        //cout << ans << endl;
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= n; ++j) {
                dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1]) % mod;;
                if(s[i] > t[j]) {
                    dp[i][j] = (dp[i][j] + dp2[i - 1][j - 1]) % mod;
                }
                dp2[i][j] = dp2[i - 1][j];
                if(s[i] == t[j])
                    dp2[i][j] = (dp2[i][j] + dp2[i - 1][j - 1]) % mod;
            }
        }
        ans = (ans + dp[n][m]) % mod;
        printf("%d\n", ans);
    }
    return 0;
}

H.サブシーケンス2

午前2時46分で解きます

長さ\(nは(1 <= N <= 10000)\) 文字列、直前に\(メートル(2 <= M <= 10)\) 小文字、あなたがのために\(M * (M-1)/ 2 \ ) 文字列を、元の文字列は、例えば、2つだけの文字のサブ文字列が含まれ表し(ABC \)は\あなたを与えるだろう\(AB、BC、AC \ ) 3つのサブストリング生の文字列を作成してください。

ゲームは、図2に内蔵されたセグメントツリーの最適化を書いたとき、過去に一目は、トポロジカル整列です。実際には、限りの文字は、ライン上のエッジに隣接して構築されているように

I.三点1

upsolved

チームメイトは、あなたの矩形領域と三角形の内側の長方形の3辺の長さを与える行うあなたが出力する三角形の頂点の座標を可能に嵌合する一つの頂点が矩形の反対側の頂点、矩形の最も長い辺が頂点に設けられ、前記上、十分に正当である第三のポイントを見て

おすすめ

転載: www.cnblogs.com/tusikalanse/p/11291480.html