BZOJ3601 一个人的数论
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\),则
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\),那么
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 一个人的数论的更多相关文章
- BZOJ3601 一个人的数论 【数论 + 高斯消元】
题目链接 BZOJ3601 题解 挺神的 首先有 \[ \begin{aligned} f(n) &= \sum\limits_{x = 1}^{n} x^{d} [(x,n) = 1] \\ ...
- BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值
传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...
- BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...
- [bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]
题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^ ...
- 【BZOJ3601】一个人的数论(数论)
[BZOJ3601]一个人的数论(数论) 题面 BZOJ 怎么这图片这么大啊... 题解 要求的是\(\displaystyle \sum_{i=1}^n [gcd(i,n)=1]i^d\) 然后把\ ...
- 【BZOJ3601】一个人的数论 高斯消元+莫比乌斯反演
[BZOJ3601]一个人的数论 题解:本题的做法还是很神的~ 那么g(n)如何求呢?显然它的常数项=0,我们可以用待定系数法,将n=1...d+1的情况代入式子中解方程,有d+1个方程和d+1个未知 ...
- 【bzoj3601】一个人的数论 莫比乌斯反演+莫比乌斯函数性质+高斯消元
Description Sol 这题好难啊QAQ 反正不看题解我对自然数幂求和那里是一点思路都没有qwq 先推出一个可做一点的式子: \(f(n)=\sum_{k=1}^{n}[(n,k)=1]k^d ...
- 【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元
题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstrin ...
- 【bzoj3601】一个人的数论(莫比乌斯反演+拉格朗日插值)
传送门 题意: 求\[ \sum_{i=1}^{n}i^d[gcd(i,n)=1] \] 思路: 我们对上面的式子进行变换,有: \[ \begin{aligned} &\sum_{i=1}^ ...
随机推荐
- Java 基础笔记
1. 面向对象三大特性:封装,继承,多态,java面向对象的最终父类是:Object 2. getInstance() 单实例设计模式factory() 工厂模式build() 建造者模式 3. 静态 ...
- java中身份证号和的银行卡的深度校验
一: 身份证号: package com.mobile.utils; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...
- iOS-xcconfig环境变量那些事(配置环境的配置)
前言 在配置宏定义参数时,会发现一个问题,在需要临时修改或者测试一些数据时,修改宏,如果不修改,就多写一个,注释掉原来的,然后测试后,再换回来,当然了,如果一两个宏,可以这样,但是,如果每次改的比较多 ...
- C#枚举中使用Flags特性
.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,这样我们就可以用"或"运算符组合 ...
- 前端安全 -- XSS攻击
XSS漏洞是最广泛.作用最关键的web安全漏洞之一.在绝大多数网络攻击中都是把XSS作为漏洞链中的第一环,通过XSS,黑客可以得到的最直接利益就是拿到用户浏览器的cookie,从而变相盗取用户的账号密 ...
- 【原创】手动导入SQLServer数据到SQLCE方法
我找到一个工具,可以很容易把SQLServer里的数据导入到SQLCE: 工具名:Export2SqlCe.exe, 下载路径: http://exportsqlce.codeplex.com/rel ...
- Winform 多线程--解决界面卡死问题
public class ThreadInvoker { /// <summary> /// 回调委托 带参数的 /// </summary> /// <param na ...
- Spark集群测试
1. Spark Shell测试 Spark Shell是一个特别适合快速开发Spark原型程序的工具,可以帮助我们熟悉Scala语言.即使你对Scala不熟悉,仍然可以使用这一工具.Spark Sh ...
- text_edit 未定义解决
找到文件:admin\controller\setting $data['heading_title'] = $this->language->get('heading_title'); ...
- 前端通信:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布
距离上一次博客大概好多好多时间了,感觉再不搞点东西出来,感觉就废了的感觉.这段时间回老家学习驾照,修养,然后7月底来上海求职(面了4家,拿了3家office),然后入职同程旅游,项目赶进度等等一系列的 ...