模板题求卡常
查看原帖
模板题求卡常
427623
XiaoQuQu楼主2022/2/10 08:17

AC 前三个点,TLE 后面两个点。卡不动了,求帮忙卡常。

(本来想去 LOJ 上交一发的,但 LOJ 炸了)

#include <bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
        {
            f = -1;
        }
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar()

            ;
    }
    return x * f;
}

const int MAXN = 5e6 + 5;
int n, p, k, a[MAXN], sv[MAXN], s[MAXN], ans;

int quickpow(int x, int y)
{
    int ret = 1, base = x;
    while (y)
    {
        if (y & 1)
        {
            ret *= base;
            ret %= p;
        }
        base *= base;
        base %= p;
        y >>= 1;
    }
    return ret;
}

signed main(void)
{
    n = read(), p = read(), k = read();
    for (int i = 0; i < n; i++)
    {
        a[i] = read();
    }
    s[0] = a[0];
    for (int i = 1; i < n; i++)
    {
        s[i] = s[i - 1] * a[i] % p;
    }
    sv[n - 1] = quickpow(s[n - 1], p - 2);
    for (int i = n - 2; i >= 0; i--)
    {
        sv[i] = sv[i + 1] * a[i + 1] % p;
    }
    for (int i = 0; i < n; i++)
    {
        if (i == 0)
        {
            ans += (quickpow(k, i + 1) % p * sv[i]) % p;
            ans %= p;
            continue;
        }
        // cout << "ny of a[" << i << "] is" << (sv[i] * s[i - 1]) % p << endl;
        ans += (quickpow(k, i + 1) % p * (sv[i] % p * s[i - 1] % p)) % p;
        ans %= p;
    }
    printf("%lld",ans);
    return 0;
}
2022/2/10 08:17
加载中...