社区讨论

高阶等差数列解法 TLE 求条

P12405 「CZOI-R3」星光闪耀参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhizked2
此快照首次捕获于
2025/11/03 18:17
4 个月前
此快照最后确认于
2025/11/03 18:17
4 个月前
查看原帖
CPP
#include <iostream>
#include <cstring>
#include <cmath>
#define big long long
using namespace std;
constexpr big mod = 998244353;
big T,k,n,m;
big ans;
big val[2000006],jc[2000006];
big cal[2000006]={1}; // 预处理 n 阶等差数列求和公式
big inv[2000006];
big ksm(big x,big k)
{
    big rt = 1, tmp = x;
    while(k)
    {
        if(k&1) rt = rt*tmp%mod;
        k >>= 1;
        tmp = tmp*tmp%mod;
    }
    return rt;
}
void init()
{
    big N = m;
    cal[1] = N;
    cal[2] = N*(N+1)%mod*ksm(jc[2],mod-2)%mod;
    for(big i = 2;i <= n;i++) cal[i+1] = cal[i]*jc[i]%mod*ksm(jc[i+1],mod-2)%mod*(N+i)%mod;
}
int main()
{
    jc[0] = 1;
    for(big i = 1;i <= 2000000;i++) jc[i] = (jc[i-1]*i)%mod;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld %lld %lld",&n,&m,&k);
        init();
        ans = 0; big base = k;
        for(big i = n-1;i >= 0;i--)
        {
            ans = (ans+cal[i]*k%mod)%mod;
            k = k*base%mod;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...