Lucas定理

当\(p\)是质数时,有\((^n_m)\equiv(^{n/p}_{m/p}) * (^{n\%p}_{m\%p}) \pmod{p}\)

狄利克雷卷积

定义:\((f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})\)

然后满足交换律,结合律,分配律

单位元:\(e=[n=1]\),即\(f*e=e*f=f\)

逆元:对于每一个\(f(1)\ne0\)的函数\(f\),存在逆元\(g\)使得\(f*g=e\)

那么\(g(n)\)满足递推式:

\(g(n)=\frac{1}{f(1)}([n=1]-\sum_{i|n,i\ne1}f(i)g(\frac{n}{i}))\)

Extra

定义1:\((f\oplus g)(x)=\sum_{x|d}f(\frac{d}{x})g(d)\)

那么有,\((f*g)\oplus h =f \oplus (g \oplus h)\)

定义2:\((f\cdot g)(x)=f(x)g(x)\)

那么当\(f\)是完全积性函数时,有\((f\cdot g)*(f\cdot h)=f\cdot (g*h)\)

常见数论函数

\(1(x)=1\)

\(id^k(x)=x^k\)

\(\phi(x)=\sum_{i=1}^{x}[gcd(i,x)=1]\)

\(d(x)=\sum_{d|x}1\)

\(\sigma(x)=\sum_{d|x}d\)

\(\mu:1\)的逆元

其中的一些关系:

\(d = 1*1\)

\(id = 1*\phi\)

\(\sigma=1*id=1*1*\phi=d*\phi\)

\(\phi=id*\mu\)

\(1=d*\mu\)

\(id=\sigma*\mu\)

莫比乌斯反演

如果\(g=f*1\),则\(g*\mu=f\)

如果\(g=1\oplus f\),则\(f=\mu \oplus g\)

证明:\(\mu \oplus g=\mu \oplus (1 \oplus f)=(\mu * 1)\oplus f = f\)

例题

[SDOI2015] 约数个数和

求\(\sum_{i=1}^n\sum_{i=1}^md(ij)\)

\(d(ij)=\sum_{a|i}\sum_{b|j}[gcd(a,b)=1]\)

那么,原式等于

\[\sum_{i=1}^n\sum_{i=1}^m\sum_{a|i}\sum_{b|j}[gcd(a,b)=1]=
\sum_{i=1}^n\sum_{j=1}^m\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{j}\rfloor[gcd(i,j)=1]
\]

\[\sum_{d=1}^n\mu(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{id}\rfloor\sum_{i=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{m}{id}\rfloor
\]

定义:\(S(n)=\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\)

void init() {
mu[1] = 1;
for (int i = 2; i <= 50000; i++) {
if (!np[i]) { p[++tot] = i; mu[i] = -1; }
for (int j = 1; j <= tot && p[j] * i <= 50000; j++) {
np[p[j] * i] = 1;
if (!(i % p[j])) break;
mu[p[j] * i] = -mu[i];
}
}
for (int i = 2; i <= 50000; i++) mu[i] += mu[i - 1];
for (int i = 1; i <= 50000; i++)
for (int l = 1, r; l <= i; l = r + 1) {
r = i / (i / l);
S[i] += (r - l + 1) * (i / l);
}
return ;
}
main() {
init();
int T;
scanf("%lld", &T);
while (T--) {
int n, m;
scanf("%lld%lld", &n, &m);
if (n > m) swap(n, m);
int ans = 0;
for (int l = 1, r; l <= n; l = r + 1) {
r = min(m / (m / l), n / (n / l));
ans += (mu[r] - mu[l - 1]) * S[n / l] * S[m / l];
}
printf("%lld\n", ans);
}
return 0;
}

[SHOI2015]超能粒子炮·改

求\(\sum_{i=0}^{k}(^n_i)\)

根据\(Lucas\)定理

可以通过对模数相同的放在一块计算

再递归求解即可。

int Lucas(LL n, LL m) {
if (!n || !m) return 1;
return Lucas(n / P, m / P) * C[n % P][m % P] % P;
}
int f(LL n, LL k) {
if (n <= 3000 && k <= 3000) return F[n][k];
return (f(n % P, P - 1) * f(n / P, k / P - 1) % P +
f(n % P, k % P) * Lucas(n / P, k / P) % P) % P;
}
void init() {
for (int i = 0; i <= 3000; i++) C[i][0] = 1;
for (int i = 1; i <= 3000; i++)
for (int j = 1; j <= i; j++)
C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % P;
for (int i = 0; i <= 3000; i++) {
F[i][0] = C[i][0];
for (int j = 1; j <= 3000; j++)
F[i][j] = (F[i][j - 1] + C[i][j]) % P;
}
return ;
}

CF1097F Alex and a TV Show

因为只关心奇偶性,我们考虑使用\(bitset\)维护因子集合\(g(x)\)

操作2是异或

操作3是并

因为\(g=1\oplus f\)

\(f(x)\)是\(x\)在集合出现的次数

反演一下就是,\(f=\mu\oplus g\)

void prework(int n) {
Mu.set();
for (int i = 2; i * i <= n; i++)
for (int j = 1; j * i * i <= n; j++)
Mu[i * i * j] = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j * i <= n; j++)
mu[i][j * i] = Mu[j], p[j * i][i] = 1;
}
int main() {
prework(7000);
int n, Q;
scanf("%d%d", &n, &Q);
while (Q--) {
int op, x, y, z;
scanf("%d%d%d", &op, &x, &y);
if (op == 1) S[x] = p[y];
else if (op == 2) {
scanf("%d", &z);
S[x] = S[y] ^ S[z];
}
else if (op == 3) {
scanf("%d", &z);
S[x] = S[y] & S[z];
}
else printf("%d", (mu[y] & S[x]).count() & 1);
}
return 0;
}

Luogu5176 公约数

首先,\(gcd(ij,jk,ik)=\frac{gcd(i,j)gcd(j,k)gcd(i,k)}{gcd(i,j,k)}\)

那么,

\(Ans=\sum_i\sum_j\sum_k(i,j)^2(j,k)^2(i,k)^2\)

\(=\sum_i\sum_j\sum_k(i,j)^2(j,k)^2+\sum_i\sum_j\sum_k^2(j,k)^2(i,k)^2+\sum_i\sum_j\sum_k(i,j)^2(i,k)^2\)

那么定义\(F(n,m)=\sum_i\sum_j(i,j)^2\),则\(Ans=F(n,m)*p+F(n,p)*m+F(m,p)*n\)

现在问题就是求\(F(n,m)\)

\(F(n,m)=\sum_i\sum_j(i,j)^2\)

\(=\sum_{d=1}^nd^2\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(i,j)=1]\)

\(=\sum_{d=1}^nd^2\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}\sum_{k|i,k|j}\mu(k)\)

\(=\sum_{d=1}^nd^2\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor\)

到这一步已经可以做到\(O(n ^ \frac{3}{4})\)

考虑优化,

设\(T=kd\)

原式\(=\sum_{T=1}^n\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum_{d|T}d^2\mu(\frac{T}{d})\)

可以发现后面就是\(id^2*\mu\)

显然是个积性函数,考虑线性筛

\(f(p^0)=1\)

\(f(p)=p^2-1\)

\(f(p^k)=(p^2-1)p^{2(k-1)}=p^2f(p^{k-1})\)

xgzc— math 专题训练(一)的更多相关文章

  1. xgzc— math 专题训练(二)

    费马小定理&欧拉定理 费马小定理: 如果\(p\)是一个质数,而整数\(a\)不是\(p\)的倍数,\(a^{p-1}\equiv1\pmod p\) 欧拉定理: 当\(a\)与\(n\)互质 ...

  2. dp专题训练

    ****************************************************************************************** 动态规划 专题训练 ...

  3. DP专题训练之HDU 2955 Robberies

    打算专题训练下DP,做一道帖一道吧~~现在的代码风格完全变了~~大概是懒了.所以.将就着看吧~哈哈 Description The aspiring Roy the Robber has seen a ...

  4. bryce1010专题训练——LCA

    1.Targan算法(离线) http://poj.org/problem?id=1470 /*伪代码 Tarjan(u)//marge和find为并查集合并函数和查找函数 { for each(u, ...

  5. bryce1010专题训练——LCT&&树链剖分

    LCT&&树链剖分专题 参考: https://blog.csdn.net/forever_wjs/article/details/52116682

  6. bryce1010专题训练——Splay树

    Prob Hint BZOJ 3323 文艺平衡树 区间翻转 BZOJ 1251 序列终结者 区间翻转,询问最值 BZOJ 1895 supermemo 区间加,翻转,剪切,询问最值.点插入,删除. ...

  7. bryce1010专题训练——划分树

    1.求区间第K大 HDU2665 Kth number /*划分树 查询区间第K大 */ #include<iostream> #include<stdio.h> #inclu ...

  8. bryce1010专题训练——树状数组

    Bryce1010模板 1.一维树状数组 https://vjudge.net/contest/239647#problem/A[HDU1556] #include<bits/stdc++.h& ...

  9. Leedcode算法专题训练(数组与矩阵)

    1. 把数组中的 0 移到末尾 283. Move Zeroes (Easy) Leetcode / 力扣 class Solution { public void moveZeroes(int[] ...

随机推荐

  1. JS 06 bom 框窗_页面_定时任务

    BOM(Broswer Object Model) 凡是 window 的属性和方法,均可以省略“window.” 方法: 框窗 1.警告框 window.alert("msg") ...

  2. linux上启动tomcat报错:Failed to read schema document 'http://www.springframework.org/schema/data/mongo/spring-mongo-2.0.xsd

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7596118 ,转载请注明出处! spring在加载xsd文件时总是先试图在本地查找xs ...

  3. 在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组)

    原文:在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必 ...

  4. MySQL高版本默认密码查找

    解决方式如下: 1:找到mysql的安装目录到跟目录下找到Data文件夹 2:打开Data/文件夹找到一个以.err结尾的文件用记事本打开,里面记录了你安装Mysql的一些日志,其中就记录了你的初始密 ...

  5. Vue绑定的table页面在Chrome浏览器左右抖动

    现象: 今天Chrome浏览器升级到最新版本(75.0.3770.100),突然发现之前vue页面只要绑定了el-table标签的,都在左右抖动,抖动得眼睛都花了,百度上找半天也没有遇到相同问题的人, ...

  6. 听课笔记--DP--最大子矩阵和

    最大子矩阵问题 给定一个n*n(0<n<=120)的矩阵, 矩阵内元素有正有负, 请找到此矩阵的内部元素和最大的子矩阵 样例输入: 4 0 -2 -7  0  9  2 -6  2  -4 ...

  7. VBA教程(一)

    VBA代表Visual Basic for Applications,它是一个来自Microsoft的事件驱动的编程语言. 现在它主要用于Microsoft Office应用程序,如MSExcel,M ...

  8. H5各种头部meta标签功能大全

    <!DOCTYPE html>  H5标准声明,使用 HTML5 doctype,不区分大小写 <head lang=”en”> 标准的 lang 属性写法 <meta ...

  9. pkg-config命令

    返回已安装库文件的元信息 pkg-config读取.pc文件获取信息 基本思想 编译的时候-I指定头文件路径:-L指定库文件路径.这样做总感觉很麻烦 事先把库的位置信息等保存起来,需要的时候再通过特定 ...

  10. ubuntu创建kvm虚拟机

    CPU虚拟化支持 [root@ubuntu~]# egrep -o '(vmx|svm)' /proc/cpuinfo vmx vmx vmx vmx KVM环境 [root@ubuntu ~]# a ...