Description

定义

\[f_k(n)=\sum_{\substack{1\leq i\leq n\\gcd(i,n)=1}}i^k
\]

给出\(n=\prod_{i=1}^w p_i^{a_i}\),求\(f_k(n)\)。\(1\leq w\leq 1000, 1\leq q_i,a_i\leq 10^9\)。保证\(p_i\)都为质数且互不相同。

Solution

令\(g_k(n)=\sum_{i=1}^ni^k\),则

\[\begin{aligned}
g_k(n)&=\sum_{i=1}^ni^k\\
&=\sum_{d|n}\sum_{\substack{1\leq i\leq n\\gcd(i,n)=d}}i^k\\
&=\sum_{d|n}d^k\sum_{\substack{1\leq i\leq \frac nd\\gcd\left(i,\frac nd\right)=d}}i^k\\
&=\sum_{d|n}d^kf_k\left(\frac nd\right)
\end{aligned}
\]

也即\(g_k(n) = (n^k) * f_k(n)\)(\(*\)表示狄利克雷卷积)。

由于\((n^k)*(\mu(n)n^k)=[n=1]\),所以\(f_k(n)=(\mu(n)n^k)*g_k(n)\)。

显然\(g_k(n)\)可以写成\(\sum_{i=1}^{k+1}a_in^i\),那么

\[\begin{aligned}
f_k(n)&=\sum_{d|n}\mu(d)d^k\sum_{i=1}^{k+1}a_i\left(\frac nd\right)^i\\
&=\sum_{i=1}^{k+1}a_i\sum_{d|n}\mu(d)d^k\left(\frac nd\right)^i\\
&=\sum_{i=1}^{k+1}a_in^i\sum_{d|n}\mu(d)d^{k-i}\\
\end{aligned}
\]

\(\sum_{d|n}\mu(d)d^{k-i}\)显然是积性函数,所以对每个质因子\(O(1)\)求出之后乘起来即可。

所有\(a_i\)提前高消出来就行了。

Code

#include <algorithm>
#include <cstdio>
#include <cstring>
const int D = 105;
const int mod = 1000000007;
typedef long long LL;
inline LL pow_mod(LL a, LL b) {
LL ans = 1;
for (a %= mod, (b += mod - 1) %= mod - 1; b; b >>= 1, a = a * a % mod)
if (b & 1) ans = ans * a % mod;
return ans;
}
inline LL inv(LL a) { return pow_mod(a, -1); }
int d;
LL a[D];
void solve() {
static LL A[D][D];
LL t = 0;
for (int i = 0; i <= d; ++i) {
LL j = 1;
for (int k = 0; k <= d; ++k) A[i][k] = j = j * (i + 1) % mod;
A[i][d + 1] = ((t += d ? A[i][d - 1] : 1) %= mod);
}
for (int i = 0; i <= d; ++i) {
int j = i;
while (!A[j][i]) ++j;
for (int k = i; k <= d + 1; ++k) std::swap(A[i][k], A[j][k]);
LL inv1 = inv(A[i][i]);
for (int j = i; j <= d + 1; ++j)
A[i][j] = A[i][j] * inv1 % mod;
for (int j = i + 1; j <= d; ++j)
for (int k = d + 1; k >= i; --k)
A[j][k] = (A[j][k] - A[j][i] * A[i][k] % mod) % mod;
}
for (int i = d; ~i; --i) {
a[i + 1] = A[i][d + 1];
for (int j = i - 1; ~j; --j)
A[j][d + 1] = (A[j][d + 1] - A[j][i] * A[i][d + 1] % mod) % mod;
}
}
const int N = 1050;
int p[N], q[N];
int main() {
int w;
scanf("%d%d", &d, &w);
solve();
LL ans = 0, n = 1;
for (int i = 0; i < w; ++i) {
scanf("%d%d", &p[i], &q[i]);
n = n * pow_mod(p[i], q[i]) % mod;
}
LL y = 1;
for (int i = 1; i <= d + 1; ++i) {
y = y * n % mod;
LL t = a[i] * y % mod;
for (int j = 0; j < w; ++j)
t = t * (1 - pow_mod(p[j], d - i)) % mod;
ans = (ans + t) % mod;
}
printf("%d\n", (int)((ans + mod) % mod));
return 0;
}

BZOJ3601 一个人的数论的更多相关文章

  1. BZOJ3601 一个人的数论 【数论 + 高斯消元】

    题目链接 BZOJ3601 题解 挺神的 首先有 \[ \begin{aligned} f(n) &= \sum\limits_{x = 1}^{n} x^{d} [(x,n) = 1] \\ ...

  2. BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值

    传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...

  3. BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...

  4. [bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]

    题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^ ...

  5. 【BZOJ3601】一个人的数论(数论)

    [BZOJ3601]一个人的数论(数论) 题面 BZOJ 怎么这图片这么大啊... 题解 要求的是\(\displaystyle \sum_{i=1}^n [gcd(i,n)=1]i^d\) 然后把\ ...

  6. 【BZOJ3601】一个人的数论 高斯消元+莫比乌斯反演

    [BZOJ3601]一个人的数论 题解:本题的做法还是很神的~ 那么g(n)如何求呢?显然它的常数项=0,我们可以用待定系数法,将n=1...d+1的情况代入式子中解方程,有d+1个方程和d+1个未知 ...

  7. 【bzoj3601】一个人的数论 莫比乌斯反演+莫比乌斯函数性质+高斯消元

    Description Sol 这题好难啊QAQ 反正不看题解我对自然数幂求和那里是一点思路都没有qwq 先推出一个可做一点的式子: \(f(n)=\sum_{k=1}^{n}[(n,k)=1]k^d ...

  8. 【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元

    题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstrin ...

  9. 【bzoj3601】一个人的数论(莫比乌斯反演+拉格朗日插值)

    传送门 题意: 求\[ \sum_{i=1}^{n}i^d[gcd(i,n)=1] \] 思路: 我们对上面的式子进行变换,有: \[ \begin{aligned} &\sum_{i=1}^ ...

随机推荐

  1. javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)

    javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...

  2. 二分查找的实现(java版本)

    一.二分法查找的定义 依次将所查找数据与中心数据对比,根据大小调整数据边界二.二分查找的条件 数组必须排序三.二分查找的原理 四.二分法查找的代码 /* * 从数组当中找到4所在的索引: * {2,4 ...

  3. jquery.cropper 裁剪图片上传

    https://github.com/fengyuanchen/cropper 1.必要的文件引用: <script src="/path/to/jquery.js"> ...

  4. python中 =、copy、deepcopy的差别

    python2中,需要import copy模块 python3中,直接可以使用copy()方法,但deepcopy()还是需要导入copy模块 下面以python2为例: 对于"=&quo ...

  5. C#基础篇七类和静态成员

    1.new关键字做的4个事情 1.1 开辟堆空间 a.开辟多大的空间呢? 当前类 所有的 成员变量类型所占空间的总和 + 类型指针(方法表的地址) b.开辟了空间干什么用呢? 存放 成员变量 1.2 ...

  6. springMVC容器和Spring容器

    前段时间有人问我,为什么一定要在web.xml中配置spring的listener呢? <listener> <description>spring监听器</descri ...

  7. ExecutorService接口概要

    ExecutorService接口继承于Executor接口,主要提供以下额外功能: 管理终结 产生Future对象,用于跟踪一个或多个任务的进度.   ExecutorService可以被shut ...

  8. 【区块链Go语言实现】Part 1:区块链基本原型

    0x00 介绍 区块链(Blockchain)是21世纪最具革命性的技术之一,目前它仍处于逐渐成熟阶段,且其发展潜力尚未被完全意识到.从本质上讲,区块链只是一种记录的分布式数据库.但它之所以独特,是因 ...

  9. DOS在这里

    转自: http://blog.csdn.net/rheostat/article/details/8043835 在右键菜单中添加Dos快捷通道-dos在这里 在右键菜单中添加 Dos 窗体 不用每 ...

  10. C# DateTime 转 JavaScript Date

    @{ var minTicks = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks; var nowTicks = DateTime ...