传送门

题意:

求$$

\sum_{i=1}{n}id[gcd(i,n)=1]

\[
思路:
我们对上面的式子进行变换,有:
\]

\begin{aligned}

&\sum_{i=1}^{n}i[gcd(i,n)=1]\

=&\sum_{i=1}^{n}i\sum_{x|gcd(i,n)}\mu (x)\

=&\sum_{i=1}^n i\sum_{x|i,x|n}\mu(x)\

=&\sum_{x|n}\mu(x)xd\sum_{i=1}{\frac{n}{x}}i^d

\end{aligned}

\[
以上都是一些套路,接下来才步入正题。
因为形如$\sum_{i=1}^n i^d$这种都是一个以$n$为自变量的,最高项次数为$d+1$的多项式。

到这步后,我们将后面的形式化,即将多项式表示出来,设$a_i$为相关系数,那么就有式子等于:
\]

\sum_{x|n}\mu(x)xd\sum_{i=0}{d+1}a_i\lfloor\frac{n}{x}\rfloor^i

\[变化一下有:
\]

\sum_{i=0}{d+1}a_i\sum_{x|n}\mu(x)xd\lfloor\frac{n}{x}\rfloor^i

\[
这里面前面的$a_i$为多项式的系数,是未知的。
但其实因为我们知道多项式的形式为$\sum_{i=0}^{d+1}a_ix^i$,我们可以直接把$x=1,x=2,\cdots,x=d+1$的值求出来,然后高斯消元求解系数。
这里也可以利用拉格朗日插值来求解,代码是直接抄[yyb](https://www.cnblogs.com/cjyyb/p/10503174.html)(orz)的,思路应该是利用一下等式来求系数:
\]

\sum_{i=0}^n y_i\prod_{i!=j}\frac{x-x_j}{x_i-x_j}

\[
那么现在主要就是后面一部分的计算,我们令$f(x)=\mu(x)x^d,g(x)=x^i$,那么后面一部分可以写为:$\sum_{x|n}f(x)g(\frac{n}{x})$,这是狄利克雷卷积的的形式,因为$f,g$都为积性,那么$h=f*g(n)$也为积性。
所以$h(n)=\sum_{x|n}\mu(x)x^d\lfloor\frac{n}{x}\rfloor^i$也为积性函数,那么我们可以考虑单独素因子的贡献。显然每个素因子只会出现$0$次或者$1$次,否则贡献为$0$,那么有:
\]

\begin{aligned}

h(pa)&=\sum_{j=0}{a}\mu(pj)p{jd}(\frac{pa}{pj})^i\

&=p{ai}-p{ai}p^{d-i}

\end{aligned}

\[
那么对于每个$i,0\leq i\leq d+1$,求出相应的$h(n)$,再与系数相乘最终结果就出来了。

感觉解法中将多项式形式化出来的想法很巧妙!没想到多项式还能这么用hhh,直接求解多项式的系数也是之前没想到的。之后对卷积的观察也很重要。
很好的一个题。细节参考代码:
```cpp
/*
* Author: heyuhhh
* Created Time: 2019/11/21 19:44:08
*/
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '\n'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
#else
#define dbg(...)
#endif
void pt() {std::cout << '\n'; }
template<typename T, typename...Args>
void pt(T a, Args...args) {std::cout << a << ' '; pt(args...); }
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 1000 + 5, MOD = 1e9 + 7;

ll qpow(ll a, ll b) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return ans;
}
//求d次多项式系数
struct Lagrange {
ll f[N], a[N], b[N];
int d;
void init(int _d) {
d = _d;
//y_i
for(int i = 1; i <= d + 1; i++) f[i] = (f[i - 1] + qpow(i, d - 1)) % MOD;
b[0] = 1;
}
void work() {
for(int i = 0; i <= d; i++) {
for(int j = i + 1; j; j--) b[j] = (b[j - 1] + MOD - 1ll * b[j] * (i + 1) % MOD) % MOD;
b[0] = 1ll * b[0] * (MOD - i - 1) % MOD;
}
for(int i = 0; i <= d; i++) {
int s = f[i + 1], inv = qpow(i + 1, MOD - 2);
for(int j = 0; j <= d; j++) if(i != j) s = 1ll * s * qpow((i - j + MOD) % MOD, MOD - 2) % MOD;
b[0] = 1ll * b[0] * (MOD - inv) % MOD;
for(int j = 1; j <= d + 1; j++) b[j] = (MOD - 1ll * (b[j] + MOD - b[j - 1]) * inv % MOD) % MOD;
for(int j = 0; j <= d + 1; j++) a[j] = (a[j] + 1ll * s * b[j]) % MOD;
for(int j = d + 1; j; j--) b[j] = (b[j - 1] + MOD - 1ll * b[j] * (i + 1) % MOD) % MOD;
b[0] = 1ll * b[0] * (MOD - i - 1) % MOD;
}
}
}A;

int d, w;
ll prod[N];

void run(){
A.init(d + 1);
A.work();
for(int i = 0; i <= d + 1; i++) prod[i] = 1;
while(w--) {
int p, a; cin >> p >> a;
for(int i = 0; i <= d + 1; i++) {
ll res = (qpow(p, 1ll * a * i) - qpow(p, 1ll * a * i + d) * qpow(qpow(p, i), MOD - 2) % MOD + MOD) % MOD;
prod[i] = prod[i] * res % MOD;
}
}
ll ans = 0;
for(int i = 0; i <= d + 1; i++) ans = (ans + A.a[i] * prod[i] % MOD) % MOD;
cout << ans << '\n';
}

int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
while(cin >> d >> w) run();
return 0;
}
```\]

【bzoj3601】一个人的数论(莫比乌斯反演+拉格朗日插值)的更多相关文章

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

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

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

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

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

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

  4. 【BZOJ4176】Lucas的数论 莫比乌斯反演

    [BZOJ4176]Lucas的数论 Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)) ...

  5. 51Nod1675 序列变换 数论 莫比乌斯反演

    原文http://www.cnblogs.com/zhouzhendong/p/8665675.html 题目传送门 - 51Nod1675 题意 给定序列$a,b$,让你求满足$\gcd(x,y)= ...

  6. UOJ#62. 【UR #5】怎样跑得更快 数论 莫比乌斯反演

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ62.html 题解 太久没更博客了,该拯救我的博客了. $$\sum_{1\leq j \leq n} \ ...

  7. [SPOJ VLATTICE]Visible Lattice Points 数论 莫比乌斯反演

    7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N lattice. One corner is at (0,0, ...

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

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

  9. 【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

随机推荐

  1. Spring 事务 属性 详细

    学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性. 传播属性 传播属性定义的是当一个事务方法碰到另一个事 ...

  2. jstree级联禁用后代节点的选择框

    用jstree+jquery,做的树形展示. 这个话题,在Stack Overflow上有问答,要获取要禁用的节点,然后用获取子节点方法遍历后代节点,设置禁用选择框. 之后发现,jstree的获取子节 ...

  3. KVM使用总结

    目录 一.虚拟化介绍 二.通过kvm安装centos7系统 三.常用操作 虚拟机列表 开关机 导出虚拟机 重命名 挂起&恢复 查看某个虚拟机对应的端口 kvm开机启动 console登陆(失败 ...

  4. 2019年最新50道java基础部分面试题(四)

    前35题请移步上几篇文章 36.数组有没有length()这个方法? String有没有length()这个方法?  数组没有length()这个方法,有length的属性.String有有lengt ...

  5. Node.js使用Nodemailer发送邮件

    除了Python,在node中收发电子邮件也非常简单,因为强大的社区有各种各样的包可以供我么直接使用.Nodemailer包就可以帮助我们快速实现发送邮件的功能. Nodemailer简介 Nodem ...

  6. vue表格合并行的一个实例

        一.element控件实现 在平常的应用中,需要用到合并单元格的操作,在Excel中,这种操作很好实现,但在实际项目中,常常需要借助element控件来实现. 下面是element中的一个实例 ...

  7. Redis缓存雪崩,缓存穿透,热点key解决方案和分析

    缓存穿透 缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力. (查询一个必然不存在的数据.比如文章表,查询一个不存 ...

  8. 15-scrapy-redis两种形式分布式爬虫

    什么叫做分布式爬虫? 分布式爬虫,就是多台机器共用一个scrapy—redis程序高效爬取数据, 为啥要用分布式爬虫? 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器 ...

  9. [转]探索ASP.NET Core 3.0 系列

    这是该系列的第一篇文章:探索ASP.NET Core 3.0. 第1部分-探索新的项目文件Program.cs和通用主机(本文) 第2部分-比较ASP.NET Core 3.0模板之间的Startup ...

  10. CAT 默认密码修改

    修改操作 1.按照如下路径,打开SessionManager类,cat-home目录下:com.dianping.cat.system.page.login.service.SessionManage ...