2020 HDU多校赛第一场

在多校赛开始的前一天晚上看到了这么一条消息,我就知道这第一场比赛肯定不简单了。

2020 HDU多校赛第一场_第1张图片

果不其然。今天多校又是罚坐的一天。在开局了一个多小时后,大部分才A了一道题。

2020 HDU多校赛第一场_第2张图片
2020 HDU多校赛第一场_第3张图片
2020 HDU多校赛第一场_第4张图片

最后靠着队友才过了两题。

1004 Distinct Sub-palindromes

要求组一个长度为n的字符串。要求子回文串要尽可能的少。

这题的题面太具有迷惑性。明明结果最大也才26*25*24。还说最后结果要取模。

一开始以为长度为n的字符串,子回文串个一定是n,那么最后结果就是26^n。但是看到一群人wa了之后。就像事情没这么简单。

后来发现当n>=4就只要组合出一个三个字母不重复的,之后一直用这个填充就可以了。例如

abcabcabcabc。

#include
using namespace std;
#define ll long long
#define pll pair
#define pii pair
pii x[200005];
#define mod 998244353
ll fpow(ll a, ll b)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        ll n;
        cin >> n;
        if (n <= 3)cout << fpow(26, n) << endl;
        else cout << 26 * 25 * 24 << endl;
    }
    return 0;
}

1005 Fibonacci Sum

这题是斐波那契数列幂和的变形。数论题属于知识盲区。就贴个代码了

#include
#include
#include
#include
using namespace std;
typedef long long ll;

const int P = 1000000009;
const int INV2 = 500000005;
const int SQRT5 = 383008016;
const int INVSQRT5 = 276601605;
const int A = 691504013;
const int B = 308495997;
long long c;
const int N = 100005;

ll n, K;
ll fac[N], inv[N];
ll pa[N], pb[N];
ll pca[N],pcb[N];
inline void Pre(int n) {
    fac[0] = 1; 
    for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % P;
    inv[1] = 1; for (int i = 2; i <= n; i++) inv[i] = (P - P / i) * inv[P % i] % P;
    inv[0] = 1; for (int i = 1; i <= n; i++) inv[i] = inv[i] * inv[i - 1] % P;
 
}

inline ll C(int n, int m) {
    return fac[n] * inv[m] % P * inv[n - m] % P;
}

inline ll Pow(ll a, ll b) {
    ll ret = 1;
    for (; b; b >>= 1, a = a * a % P)
        if (b & 1)
            ret = ret * a % P;
    return ret;
}

inline ll Inv(ll x) {
    return Pow(x, P - 2);
}

inline void Solve() {
    ll Ans = 0;
    pca[0] = pcb[0]=1;
    pca[1] = Pow(A, c);
    pcb[1] = Pow(B, c);
    for (int j = 2; j <= K; j++)
    {
        pca[j] = pca[j - 1] * pca[1] % P;
        pcb[j] = pcb[j - 1] * pcb[1] % P;
    }
    for (int j = 0; j <= K; j++) 
    {
        ll t = pca[K-j]*pcb[j] % P, tem;
        tem = t == 1 ? n % P : t * (Pow(t, n) - 1 + P) % P * Inv(t - 1) % P;
        if (~j & 1)
            Ans += C(K, j) * tem % P, Ans %= P;
        else
            Ans += P - C(K, j) * tem % P, Ans %= P;
    }
    Ans = Ans * Pow(INVSQRT5, K) % P;
    printf("%lld\n", Ans);
}

int main() {
    int T;
    Pre(100000);
    scanf("%d", &T);
    while (T--) {
        scanf("%lld%lld%lld", &n,&c, &K);
        Solve();
    }
}

你可能感兴趣的:(hdu,ACM)