传送门

题意:

求$$

\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. Scrapy对接Selenium

    首先pip安装selenium,然后下载浏览器驱动 WebDrive下载地址 chrome的webdriver:http://chromedriver.storage.googleapis.com/i ...

  2. Sublime Text 3如何关闭自动更新

    1.Preferences -> Settings-User 2.插入下面代码:"update_check": false 如果有其他的设置,用逗号隔开,然后保存 3.Pre ...

  3. echarts自定义颜色主题

    1. 进入地址:  https://echarts.baidu.com/theme-builder/ 2. 配置主题 2.1. 可以选择挑选默认方案 2.2 可以进行一些样式配置 2.3 配置背景颜色 ...

  4. 对java的几点个人浅浅的认知

    特点   简单地说,Java 具有如下特点:简单的.面向对象.平台无关.多线程.分布式.安全. 高性能.可靠的.解释型.自动垃圾回收等特点. 主要面向internet的语言 Java比其他任何一门语言 ...

  5. MATLAB实例:非线性曲线拟合

    MATLAB实例:非线性曲线拟合 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 用最小二乘法拟合非线性曲线,给出两种方法:(1)指定非线性函数,(2) ...

  6. 《Web Development with Go》实现一个简单的rest api

    设计模式完了之后,应该实现具体的应用了. 设计模式还得没事就要复习. web应用,学习的是网上的一本书. <Web Development with Go> package main im ...

  7. Idea为类生成序列号(十一)

    新建一个测试的实体类Gradle,实现java.io.Serializable接口,选择类名,按Alt+Enter键,出现的提示框中没有生成serialVersionUID的提示,这个需要设置之后才会 ...

  8. R-长尾词练习

    一. 长尾关键词的特征 长尾关键词通常比较长,往往是2-3个词组成,甚至是短语,存在于内容页面,除了内容页的标题,还存在于内容中. 长尾关键词搜索量虽然非常少,而且不稳定.但是搜索量甚至超越热门目标关 ...

  9. #undef常用法

    Copy from C语言中#undef的语法是: #undef 标识符 用来将前面定义的宏标识符取消定义. 整理了如下几种常见用法,如果以后发现其他的再添加进来. 1.在一个程序块中用完宏定义后,为 ...

  10. 2019徐州网络赛 I J M

    I. query 比赛时候没有预处理因子疯狂t,其实预处理出来因子是\(O(nlog(n))\)级别的 每个数和他的因子是一对偏序关系,因此询问转化为(l,r)区间每个数的因子在区间(l,r)的个数 ...