CCPC2017

A.

乱搞

#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cctype>
#include<cmath>
using namespace std;
int T;
string S;
int len;
int u[2][30];
int mx_u[2];
int main()
{
    cin >> T;
    while (T--)
    {
        mx_u[0] = mx_u[1] = 0;
        memset(u, 0, sizeof(u));
        cin >> S;
        len = S.length();
        for (int i = 0; i < len; ++i)
        {
            ++u[i & 1][S[i] - 'a'];
            if (u[i & 1][S[i] - 'a'] > mx_u[i & 1])
            {
                mx_u[i & 1] = u[i & 1][S[i] - 'a'];
            }
        }
        cout << (len - mx_u[0] - mx_u[1]) << endl;
    }
    return 0;
}

B.

数论乱搞
(O(2^m)) 变成 (O(m)) 需要稍加思考

#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cctype>
#include<cmath>
using namespace std;
const int MOD = 998244353;
int T, m;
long long q, p;
long long qp(long long bs, int pw)
{
    long long ret = 1;
    while (pw)
    {
        if (pw & 1)
        {
            ret *= bs;
            ret %= MOD;
        }
        bs *= bs;
        bs %= MOD;
        pw >>= 1;
    }
    return ret;
}
long long inv(int x)
{
    return qp(x, MOD - 2);
}
long long ans;
long long n;
int main()
{
    ios::sync_with_stdio(false);
    cin >> T;
    while (T--)
    {
        ans = 1;
        n = 1;
        cin >> m;
        for (int i = 1; i <= m; ++i) {
            cin >> p >> q;
            n *= qp(p, q);
            n %= MOD;
            ans *= 1ll + q - q * inv(p) % MOD + MOD;
            ans %= MOD;
        }
        cout << n * ans % MOD << endl;
    }
    // system("pause");
    return 0;
}

C.

博弈论,反正也是可以乱搞的
不乱搞也不难

暂时不想写


D.

摸一下规律就可以乱搞了

#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cctype>
#include<cmath>
using namespace std;
const int maxn = 1e5 + 10;
int T;
long long fact[maxn];
int n;
long long a;

const int MOD = 998244353;
long long qp(long long bs, long long pw)
{
    long long ret = 1;
    while (pw)
    {
        if (pw & 1)
        {
            ret *= bs;
            ret %= MOD;
        }
        bs *= bs;
        bs %= MOD;
        pw >>= 1;
    }
    return ret;
}

void pre(int n)
{
    fact[0] = fact[1] = 1;
    for (int i = 2; i <= n; ++i)
    {
        fact[i] = fact[i - 1] * i % MOD;
    }
}

long long ginv(long long x)
{
    if (!x)
        return 1;
    else
        return qp(x, MOD - 2);
}

long long gp;
int main()
{
    ios::sync_with_stdio(false);
    cin >> T;
    pre(100000);
    while (T--)
    {
        cin >> n;
        long long sm = 0;
        sm = gp = 0;
        for (int i = 1; i <= n; ++i)
        {
            cin >> a;
            gp = (gp + fact[n - 1] * ginv(i - 1) % MOD) % MOD;
            sm += gp * a % MOD;
            if (sm >= MOD) sm -= MOD;
        }
        sm *= ginv(fact[n]);
        cout << sm % MOD << endl;
    }
    // system("pause");
    return 0;
}

E.

感觉是树形 DP
不想写


J.

什么简单差分

#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cctype>
#include<cmath>
using namespace std;
int T;
int n, m;
const int MOD = 998244353;
const int maxn = 1e5 + 10;
int dv[2][maxn];
int mn[2];
long long pw[2];
long long qp(long long bs, int pw)
{
    long long ret = 1;
    while (pw)
    {
        if (pw & 1)
        {
            ret *= bs;
            ret %= MOD;
        }
        bs *= bs;
        bs %= MOD;
        pw >>= 1;
    }
    return ret;
}
int main()
{
    ios::sync_with_stdio(false);
    cin >> T;
    while (T--)
    {
        cin >> n >> m;
        for (int i = n + 1; i >= 0; --i)
            dv[0][i] = dv[1][i] = 0;
        for (int l, r, x, i = 1; i <= m; ++i)
            {
                cin >> l >> r >> x;
                ++dv[x - 2][l];
                --dv[x - 2][r + 1];
            }
            mn[0] = mn[1] = 2147483644;
            int st[2] = {0, 0};
            for (int i = 1; i <= n; ++i)
            {
                st[0] += dv[0][i];
                st[1] += dv[1][i];
                mn[0] = min(mn[0], st[0]);
                mn[1] = min(mn[1], st[1]);
            }
            pw[0] = qp(2, mn[0]);
            pw[1] = qp(3, mn[1]);
        cout << pw[0] * pw[1] % MOD << endl;
    }
    // system("pause");
    return 0;
}

K.

二分
不会


L.

很好搞。
(10^{12}) 印象里貌似就可以
枚举一下所有因数,这大概是可以承受的
然后异或的前缀和其实很好推,这个是 (log)
(为什么是异或前缀和嘛,你考虑一个 (n)(2)(3) 这两个因数
你首先考虑一下模比 (n/2) 大的那些数,再考虑模比 (n/3) 大的那些数)

虽然可能不太能过
当然这个也不一定正确

好像是类欧,我跑了


FGHI

有缘再见吧

原文地址:https://www.cnblogs.com/ccryolitecc/p/14091170.html