• loj #6247. 九个太阳


    $sumlimits_{i=1}^n [k | i] imes C_n^i$

    膜 $998244353$

    $n leq 10^{15},k leq 2^{20}$

    $k$ 是 $2$ 的正整数次方

    sol:

    “不看题解拿头做” 系列

    考虑构造一个序列 $a_i$ 满足只有 $[k|i]$ 时是 $1$,其它时候是 $0$

    之后就开始神仙了起来

    构造 $k$ 次单位根 $omega _k = g^{frac{p-1}{k}}$,发现 $frac{1}{k} imes sumlimits_{j=0}^{k-1} omega _k^{i imes j} = [k | i]$

    代入原式得到 $sumlimits_{i=1}^n frac{1}{k} imes sumlimits_{j=0}^{k-1} omega _k^{i imes j} imes C_n^i$

    根据二项式定理 $sumlimits_{i=0}^n C_n^i imes x^i = (x+1)^n$,可以化简

    $frac{1}{k} imes sumlimits_{j=0}^{k-1} (omega_k ^j + 1)^n$

    这就可以直接求了

    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    #define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
    #define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
    inline LL read() {
        LL x = 0, f = 1; char ch = getchar();
        for (; !isdigit(ch); ch = getchar())if (ch == '-')f = -f;
        for (; isdigit(ch); ch = getchar()) x = 10 * x + ch - '0';
        return x * f;
    }
    const int mod = 998244353;
    inline int ksm(int x, int t) {
        int res = 1;
        for(; t; x = 1LL * x * x % mod, t = t >> 1) if(t & 1) res = 1LL * x * res % mod;
        return res;
    }
    int main() {
        LL n = read() % (mod-1), k = read();
        int ans = 0;
        int wn = ksm(3, (mod-1) / k), w = ksm(3, (mod-1) / k);
        rep(i, 0, k-1) {
            (ans += ksm(w + 1, n)) %= mod;
            w = 1LL * w * wn % mod;
        }
        ans = 1LL * ans * ksm(k, mod - 2) % mod;
        cout << ans << endl;
    }
    View Code
  • 相关阅读:
    linux 常用命令
    基于 DirectX11 的 MMDViewer 01-简介
    基于 DirectX11 的 MMDViewer 04-渲染目标视图和多视口
    基于 DirectX11 的 MMDViewer 03-渲染管线
    基于 DirectX11 的 MMDViewer 02-创建一个窗口
    Simple2D-26 Simple2D 最后的工作,开发结束
    Simple2D-25 精灵动作
    Simple2D-24 Sprite 渲染树
    Simple2D-23(重构)反走样几何图形
    Simple2D-22(重构)纹理池
  • 原文地址:https://www.cnblogs.com/Kong-Ruo/p/10491026.html
Copyright © 2020-2023  润新知