首页 > 其他分享 >【题解】P6271 [湖北省队互测2014]一个人的数论

【题解】P6271 [湖北省队互测2014]一个人的数论

时间:2023-03-03 15:59:19浏览次数:38  
标签:队互测 limits int 题解 sum mu P6271 il mod

很久之前存的古代经典题,思路是 cyj 的。

感谢那时候先辈们的分享精神,这就是十年前的 OI 圈子吗。

思路

莫比乌斯反演。

首先注意到一个自然数幂次和,令 \(F(n) = \sum\limits_{i = 1}^n i^k\),有经典结论是 \(F(n)\) 是关于 \(n\) 的 \(k + 1\) 次多项式。

尝试用类似的结构表示答案:令 \(G(n) = \sum\limits_{i = 1} i^k [\gcd(i, n) = 1]\).

考虑到 \(F(n), G(n)\) 之间的相似性,这里不采用 \(\mu\) 反演将 \(G(n)\) 化简,而是考虑应用莫比乌斯反演。

考虑 \(n\) 的每个质因子作为 \(\gcd\) 时的贡献,注意到 \(F(n) = \sum\limits_{d \mid n} d^k F(\frac{n}{d})\).

对其应用莫比乌斯反演得 \(G(n) = \sum\limits_{d \mid n} \mu(d) d^k F(\frac{n}{d})\).

将 \(F(\frac{n}{d})\) 展开成多项式形式:\(G(n) = \sum\limits_{d \mid n} \mu(d) d^k \sum\limits_{i = 0}^{k + 1} f_i (\frac{n}{d})^i\).

整理得 \(G(n) = \sum\limits_{i = 0}^{k + 1} f_i n^i \sum\limits_{d \mid n} \mu(d) d^{k - i}\).

因为 \(\mu(d) d^{k - i}\) 是积性函数,并且题目提醒我们 \(n\) 可以分解成唯一分解形式。

因此可以考虑把后面的部分看成是每个质因子的贡献之并,这样每个质因子单独的贡献或许是容易求的。

一般而言对于含有 \(\mu\) 的高次项,因为 \(\mu(x^2) = 0\),所以都会获得次数至多为 \(1\) 的限制。

所以有 \(G(n) = \sum\limits_{i = 0}^{k + 1} f_i n^i \prod\limits_{p_j \mid n} \sum\limits_{t = 0}^{a_j} \mu(p_j^t) p_j^{t (k - i)}\).

因为 \(t \geq 2\) 时 \(\mu = 0\),所以只需要考虑 \(t \leq 1\) 时的贡献。

于是有 \(G(n) = \sum\limits_{i = 0}^{k + 1} f_i n^i \prod\limits_{p_j \mid n} (1 - p_j^{k - i})\).

于是现在我们只需要获得关于自然数幂和的多项式就可以解决问题了。

根据上文只需要随意拉插带走,跑得飞快。

代码

#include <cstdio>
using namespace std;

#define il inline

const int maxn = 1e3 + 5;
const int mod = 1e9 + 7;

il int cmod(int x) { return (x >= mod ? x - mod : x); }
il void add(int &x, int y) { x += y, x -= (x >= mod ? mod : 0); }
il int qpow(int base, int power = mod - 2)
{
    int res = 1;
    while (power)
    {
        if (power & 1) res = 1ll * res * base % mod;
        base = 1ll * base * base % mod, power >>= 1;
    }
    return res;
}

int n, k, len;
int A[maxn], f[maxn], p[maxn], al[maxn];

il void poly_mul(int a, int b)
{
    len++;
    for (int i = len; i >= 1; i--) A[i] = (1ll * A[i] * b + 1ll * A[i - 1] * a) % mod;
    A[0] = 1ll * A[0] * b % mod;
}

il void num_mul(int v) { for (int i = 0; i <= len; i++) A[i] = 1ll * A[i] * v % mod; }

il void poly_add()
{
    for (int i = 0; i <= len; i++) add(f[i], A[i]), A[i] = 0;
    A[len = 0] = 1;
}

il void init(int &k)
{
    A[0] = 1, len = 0;
    int sum = 0;
    for (int i = 1; i <= k + 3; i++)
    {
        add(sum, qpow(i, k));
        int mul = qpow(sum);
        for (int j = 1; j <= k + 3; j++)
        {
            if (i == j) continue;
            poly_mul(1, mod - j);
            mul = 1ll * mul * (i + mod - j) % mod;
        }
        num_mul(qpow(mul)), poly_add();
    }
}

int main()
{
    scanf("%d%d", &k, &n);
    int N = 1;
    for (int i = 1; i <= n; i++) scanf("%d%d", &p[i], &al[i]), N = 1ll * N * qpow(p[i], al[i]) % mod;
    init(k);
    int res = 0, pw = N;
    for (int i = 1; i <= k + 3; i++)
    {
        int ans = 1ll * pw * f[i] % mod;
        pw = 1ll * pw * N % mod;
        for (int j = 1; j <= n; j++) ans = 1ll * ans * (1 + mod - qpow(p[j], k - i + mod - 1)) % mod;
        add(res, ans);
    }
    printf("%d\n", res);
    return 0;
}

标签:队互测,limits,int,题解,sum,mu,P6271,il,mod
From: https://www.cnblogs.com/lingspace/p/p6271.html

相关文章

  • 前端问题解决步骤
    总结,有错误看错误,没明显错误看逻辑。F12查看(看连接是否有错误。)在看NetWork查看选项Fetch/XHR(看具体接口对应相关数据是否正确)找后端代码和前端代码的逻辑问题。(swagg......
  • pdf.js 预览时红章、电子签和部分文字无法显示问题解决方案
    pdf红章无法预览的问题修复方案:node_modules/pdfjs-dist/es5/build/pdf.worker.js注释一行代码:this.setFlags(_util.AnnotationFlag.HIDDEN)pdf电子签、部分文字不......
  • lg8935 [JRKSJ R7] 茎 题解
    由于标签内包含背包和树形dp,所以考虑用背包dp和树形dp求解。考虑每次合并2个连通块(一个包含根节点),设\(f_{i,j}\)表示\(i\)子树内,操作\(j\)次的方案数(未合并连通块),设\(f_{i......
  • [已解决]Android studio连接远程MySQL问题解决
    我电脑安装的是8.0的MySQL,导入使用的jar包是mysql-connector-java-5.0.71、首先先按照大佬的链接配置好一些东西,注意!已经安装8.0版本MySQL的保持原样就行,不用重新安装5.0......
  • istio 常见问题解决
    1.Commanderroroutput:xtablesparameterproblem:iptables-restore:unabletoinitializetable'nat'  Failedtoexecute:iptables-restore--noflush/tmp/i......
  • Everything 搜索失败问题解决
    平时用的好好的Everything突然某一天用不了了,什么东西都搜不出来了……就搜桌面上摆着的文件都搜不出来……下文介绍下我的解决方案解决方案任务栏找到Everything......
  • HBase存储空间撑爆导致拒绝服务的问题解决思路与操作方法记录
    时间:2022年3月29日;问题:tmss数据源切换完成后,源表数据将HBase集群内节点的存储空间撑爆,导致HBase集群内节点拒绝服务;修复:查询HDFS占用空间情况:hdfsdfs-df-h;确认是否......
  • ARC_C题解
    ARC009C错排数\(\times{C(n,k)}\)错排数可以用递推公式:\(D_n=(n-1)\times(D_{n-1}+D_{n-2})\)。具体的原理是考虑\(1\)这个位置是第几个元素填的,假设是\(k\)。分为两种情......
  • 【题解】[GDKOI2021] 空中恋爱论
    一场比赛,一个学长,一段故事,一场大梦。折戟沉沙,壮志未酬。思路cdq分治+FFT。首先意识到对和满足要求的区间计数,可以先求前缀和,再转化成前缀和的端点对计数。令\(A_n......
  • leetcode 2564. 子字符串异或查询[题解]
    链接:子字符串异或查询思路:题目说\(val\oplusfirst=second\)可得\(val=second\oplusfirst\)题目变成从\(0-1\)串中找到最先出现的\(val\)的二进制表示,注意是\(10^......