数论函数变换学习P1

积性函数

当$(n,m) = 1$时有$f(nm) = f(n)f(m)$,则称$f(x)$ 为积性函数。

线性筛法

对于每一个数字$n$,用其最小的质因数筛去,考虑最小质因数 $p$ 与数字 $n$ 的三种情况

1. $n = p$ 。

2. $p|n, p<n$

3. $else$

三种情况分别考虑即可。

以欧拉函数为例:

1. $\phi (i) = i-1$

2. $\phi (tp) = \phi (t) \times p$

3. $\phi (tp) = (p-1) \times \phi(t) $ 这样可以 $O(n)$ 筛出相应函数

例:求出 1~n! 中与 m! 互质的数字个数。

x 与 m! 互质 <-> x 与 1 ~ m 互质 <-> x 不含有 ≤ m的质数。

这样考虑 $x = m!t + k$

$p | x$ <=> $p | k$,这样有 $ans = m! \prod {1 - \frac{1}{p_i}}$

应用阶乘法筛出逆元(用 $(P-1)!^{-1}$ 逆推),预处理出后一部分前缀积,复杂度 $O(n + T)$

#include <iostream>
#include <cstdio>
#include <cstring>

#define LL long long
#define N 10000010

using namespace std;

int tot, prime[N], inv[N], fac[N], P, prev[N];
bool v[N];

int mul(int a,int b)
{
    return a*(LL)b % (LL)P;
}

int qpow(int x,int n)
{
    int ans = 1;
    for(;n;n>>=1,x = mul(x, x))
        if(n&1) ans = mul(ans, x);
    return ans;
}

void init()
{
    fac[0] = 1;
    int nl = min(N,P);
    for(int i=1;i < nl ;i++) fac[i] = mul(fac[i-1], i);
    int tmp = qpow(fac[nl-1], P-2);
    for(int i=nl-1;i>=1;i--)
    {
        inv[i] = mul(tmp, fac[i-1]);
        tmp  = mul(tmp, i);
    }
}

int main()
{
    int T;
    cin>>T>>P;
    init();
    for(int i=2;i<N;i++)
    {
        if(!v[i]) prime[++tot] = i;
        for(int j=1;i*prime[j]<N;j++)
        {
            v[i*prime[j]] = 1;
            if(i%prime[j]==0) break;
        }
    }
    int j = 1;
    prev[0] = 1;
    for(int i=1;i<N;i++)
    {
        prev[i] = prev[i-1];
        if(j<=tot && prime[j]==i)
        {
            prev[i] += P - mul(prev[i] ,inv[i]);
            if(prev[i] >= P) prev[i] -= P;
            j++;
        }
    }
    int n,m;
    while(T--)
    {
        scanf("%d%d",&n,&m);
        printf("%d\n",mul(fac[n], prev[m]));
    }
    return 0;
}

常见积性数论函数

$\mu (i)$ :狄里克莱卷积里的逆元函数

当i为若干个不同质数相乘得到,则 $\mu (i) = (-1) ^ {cnt}$ ($cnt$ 表示i中质因数的个数)

不然 $\mu (i) = 0$

1. $\mu (i) = -1$

2. $\mu (tp) = 0$

3. $\mu (tp) = -\mu (t)$

$e (i)$ :判别函数, [i =1]

$d (i)$ :约数个数,建立辅助函数 $a (i)$ 表示最小质因数的指数

$d(i) = \prod {t_i + 1}, i = p_1^{t_1} p_2^{t_2} ... p_{cnt}^{t_{cnt}}$

1. $d(i) = 2, a(i) = 1$

2. $d(tp) =  \frac{d(t)}{a(t)+1} \times (a(t)+2) , a(tp) = a(t) + 1$

3. $d(tp) = 2 d(t)$

$\sigma (i)$ :约数和

记 $F(p,t) = \frac{1 - p ^ {t + 1}}{1 - p}$

$\sigma (i) = \prod { F(p_i, t_i)  }$

1. $\sigma (i) = i+1$

2. $\sigma (tp) = \frac{\sigma (t)}{ F(p, a(t)) } \times F(p, a(t)+1)$

3. $\sigma (tp) = \sigma (t) (p+1)$

狄里克莱卷积

首先有两个常用的性质:

$\sum _{d|n} {\phi (d)} = n, \phi \times I = id$

$\sum_{d|n} {\mu (d)} = e(n), \mu \times I = e$

如果 $f, g$ 为积性函数,则有 $f \times g, f \cdot g$ 为积性函数。

时间: 2024-08-02 09:51:12

数论函数变换学习P1的相关文章

【分享】近4000份数学学习资源免费分享给大家

一直以来喜欢收集数学类的教程资源,于是费了好大劲从万千合集站上扒拉了下来,总结归类了一下,一共有将近4000本电子书.经测试,均可免费下载,可能会弹出小广告,可不必理会之.[仅供学术学习和交流,请无用于商业用途.]另外,如有可能,还请尽量支持正版纸质书.   数学史(54)     数学史.rar 55.6 MB   数学的起源与发展.rar 4.3 MB   费马大定理—一个困惑了世间智者358年的谜.pdf 9.5 MB   通俗数学名著译丛14-无穷之旅:关于无穷大的文化史.pdf 14.

细节问题思考

1.为什么high level特征位置信息不精确? fpn:The bottom-up feature map is of lower-level semantics, but its activations are more accurately localized as it was subsampled fewer times. 进一步问题:为什么下采样或者说pooling会导致位置信息不精确? 首先明确卷积层卷积后其实是有位置信息的,但经过pooling之后,对于每个pooling里面框

Javascript基础篇小结

Javascript基础篇小结 字数9973 阅读3975 评论7 喜欢28 转载请声明出处 博客原文 随手翻阅以前的学习笔记,顺便整理一下放在这里,方便自己复习,也希望你有也有帮助吧 第一课时 入门基础 知识点: 操作系统就是个应用程序 只要是应用程序都要占用物理内存 浏览器本身也是一个应用程序 浏览器本身只懂得解析HTML 调用浏览器这个应用程序的一个功能绘制 1.javascript介绍 JavaScript操作DOM的本质是=获取+触发+改变 目的:就是用来操作内存中的DOM节点 修改D

常量指针和指针常量的区别详解

引用地址 http://blog.csdn.net/beyond0525/article/details/7409305 在C/C++中关键字const用来定义一个只读的变量或者对象,有如下优点    (1)便于类型检查,如函数的函数 fun(const int a) a的值不允许变,这样便于保护实参.    (2)功能类似与宏定义,方便参数的修改和调整.如 const int max = 100:    (3)节省空间,如果再定义a = max,b=max...就不用在为max分配空间了,而用

视景体方程与剔除

这次来讨论一下视景体剔除的一些技巧,视景体在3d程序中是个很重要的概念,我们可以把视景体看作是一台摄像机也就是肉眼能够看到的空间.视景体以外的东西是看不到的,可以利用这点来剔除多余的模型,于是不必要的顶点将不会进入管线,这能够提高不少fps. 首先来看一下视景体是个啥东西 就是这么个六面棱锥,这是经过视图变换的样子,那么接下来应该进行投影变换,那么视景体就会变成这样 是一个立方体,范围是-1到1.(NDC坐标系) 假设空间中一点P(x,y,z,1)经过这一系列变换变成P1(x1/w1,y1/w1

vc++知识点

1.*+地址:代表本变量*+指针名:代表本变量(声明除外)32位系统中指针变量均占四个字节整形变量的地址即为该变量所占四个字节的首字节三级指针只能指向二级指针,二级指针只能指向一级指针,一级指针只能指向变量.2.//通过三级指针访问数组using namespace  std;int main(){    int a[5] = {99,1,2,3,4};    int*** p;    int** t;    int* s;    s=a;    t=&s;    p=&t;    cou

javascript笔记基础总结篇

Created at 2016-09-24 Updated at 2016-10-02 CategoryFront-End TagJavascript 转载请声明出处博客原文 随手翻阅以前的学习笔记,顺便整理一下放在这里,方便自己复习,也希望你有也有帮助吧 第一课时 入门基础 知识点: 操作系统就是个应用程序 只要是应用程序都要占用物理内存 浏览器本身也是一个应用程序 浏览器本身只懂得解析 HTML 调用浏览器这个应用程序的一个功能绘制 1.javascript介绍 JavaScript 操作 

常量指针和指针常量(转)

http://blog.csdn.net/beyond0525/article/details/7409305 * (指针)和 const(常量) 谁在前先读谁:*象征着地址,const象征着内容:谁在前面谁就不允许改变. int const *p1 = &b;//const 在前,定义为常量指针 int *const p2 = &c;//*在前,定义为指针常量 常量指针p1:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换. p1 = &a是正确的,但

柜位预测(二)——神经网络-FANN库

可以使用最小二乘法来进行柜位预测,但是其预测的时间短,不能很好的用于实践当中.在查询了一些资料后,神经网络是解决该问题的最好的方法.神经网络是什么,我们应该如何使用它来完成功能,我会在本篇和后续的文章中逐一介绍自己所学的心得.本篇是翻译文章,对神经网络库--FANN库进行了介绍.本人英语水平有限,有翻译不当的地方望指出. 本篇译文的原文可以从此下载. 简化神经网络 多年前,好莱坞科幻片<机械公敌>中就描述了人工神经网络预测了世界末日.然而,其却脱离了现实.当好莱坞通过人类即将灭亡的恐怖故事来吸