P4213 【模板】杜教筛、P3768 简单的数学题、P3803 【模板】多项式乘法(FFT)

news2024/11/26 20:25:21

P4213 【模板】杜教筛

题目描述

P4213 【模板】杜教筛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

运行代码

#include <iostream>
#include <map>

using namespace std;

const int N = 2000010;
long long vis[N], pm[N], mu[N], phi[N], cnt;
map<long long, long long> mp_mu, mp_phi;

void init() {
    mu[1] = phi[1] = 1;
    for (int i = 2; i < N; i++) {
        if (!vis[i]) {
            pm[++cnt] = i;
            mu[i] = -1;
            phi[i] = i - 1;
        }
        for (int j = 1; i * pm[j] < N; j++) {
            int p = pm[j];
            vis[i * p] = 1;
            if (i % p == 0) {
                phi[i * p] = phi[i] * p;
                break;
            }
            mu[i * p] = -mu[i];
            phi[i * p] = phi[i] * (p - 1);
        }
    }
    for (int i = 1; i < N; i++) {
        mu[i] += mu[i - 1];
        phi[i] += phi[i - 1];
    }
}

long long Sphi(long long n) {
    if (n < N) {
        return phi[n];
    }
    if (mp_phi.count(n)) {
        return mp_phi[n];
    }
    long long ans = n * (n + 1) / 2;
    for (long long l = 2, r; l <= n; l = r + 1) {
        r = n / (n / l);
        ans -= Sphi(n / l) * (r - l + 1);
    }
    return mp_phi[n] = ans;
}

long long Smu(long long n) {
    if (n < N) {
        return mu[n];
    }
    if (mp_mu.count(n)) {
        return mp_mu[n];
    }
    long long ans = 1;
    for (long long l = 2, r; l <= n; l = r + 1) {
        r = n / (n / l);
        ans -= Smu(n / l) * (r - l + 1);
    }
    return mp_mu[n] = ans;
}

int main() {
    init();
    long long T, n;
    cin >> T;
    while (T--) {
        cin >> n;
        cout << Sphi(n) << " " << Smu(n) << endl;
    }
    return 0;
}

代码思路

函数 init :首先对 mu[1] 和 phi[1] 进行初始化,将它们都设为 1 。然后通过两层循环来处理数 i :如果 i 未被标记为已访问(即 vis[i] == 0 ),将其认定为素数并存入 pm 数组,同时设置 mu[i] 为 -1 , phi[i] 为 i - 1 。对于每个素数 pm[j] ,如果 i * pm[j] < N ,将 vis[i * pm[j]] 标记为已访问。如果 i 能被 pm[j] 整除,更新 phi[i * pm[j]] 并跳出内层循环;否则,更新 mu[i * pm[j]] 和 phi[i * pm[j]] 。最后计算 mu 数组和 phi 数组的前缀和。

函数 Sphi :

  • 首先进行快速判断,如果 n 小于预处理的范围 N ,直接返回预处理得到的 phi[n] 值。
  • 如果 n 对应的结果未被计算过(即不在 mp_phi 映射中),则通过迭代计算:初始化 ans 为 n * (n + 1) / 2 。然后通过循环将 ans 减去子区间的结果乘以区间长度。
  • 最后将计算结果存入 mp_phi 映射中并返回。

函数 Smu :

  • 与 Sphi 函数类似,先进行快速判断,如果 n 小于 N ,直接返回 mu[n] ;如果未计算过,通过迭代计算。
  • 初始化 ans 为 1 ,通过循环更新 ans ,并将结果存入 mp_mu 映射中返回。

主函数 main :调用 init 函数进行初始化。读入测试用例的数量 T 。在每个测试用例中,读入数 n ,分别调用 Sphi 和 Smu 函数计算并输出相应的结果。

P3768 简单的数学题

题目描述

P3768 简单的数学题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

运行代码

#include<bits/stdc++.h>
#define N 5000000
#define LL long long

using namespace std;

int vis[N], p[N], phi[N], cnt;
LL P, n, sum[N], inv;
map<LL, LL> mp;

// 计算 a 的 b 次幂对 P 取模
LL powerMod(LL a, LL b) {
    LL res = 1;
    while (b) {
        if (b & 1) res = res * a % P;
        a = a * a % P;
        b >>= 1;
    }
    return res;
}

// 初始化 phi 数组和 sum 数组
void init() {
    inv = powerMod(6, P - 2);
    phi[1] = 1;
    for (int i = 2; i < N; i++) {
        if (!vis[i]) {
            p[++cnt] = i;
            phi[i] = i - 1;
        }
        for (int j = 1; i * p[j] < N; j++) {
            vis[i * p[j]] = 1;
            if (i % p[j] == 0) {
                phi[i * p[j]] = p[j] * phi[i];
                break;
            }
            phi[i * p[j]] = (p[j] - 1) * phi[i];
        }
    }
    for (int i = 1; i < N; i++)
        sum[i] = (sum[i - 1] + 1LL * i * i % P * phi[i] % P) % P;
}

// 计算 x 的平方和
LL squareSum(LL x) {
    x %= P;
    return x * (x + 1) % P * (2 * x + 1) % P * inv % P;
}

// 计算 x 的立方和
LL cubeSum(LL x) {
    x %= P;
    return (x * (x + 1) / 2) % P * ((x * (x + 1) / 2) % P) % P;
}

// 计算 Sn
LL Sn(LL x) {
    if (x < N) return sum[x];
    if (mp[x]) return mp[x];
    LL res = cubeSum(x);
    for (LL l = 2, r; l <= x; l = r + 1) {
        r = x / (x / l);
        res = (res - (squareSum(r) - squareSum(l - 1)) % P * Sn(x / l) % P + P) % P;
    }
    return mp[x] = res;
}

// 计算最终结果
LL calculate() {
    LL ans = 0;
    for (LL l = 1, r; l <= n; l = r + 1) {
        r = n / (n / l);
        ans = (ans + (Sn(r) - Sn(l - 1)) % P * cubeSum(n / l) % P + P) % P;
    }
    return ans;
}

int main() {
    scanf("%lld%lld", &P, &n);
    init();
    printf("%lld\n", calculate());
    return 0;
}

代码思路

  1. 定义了一些常量和数组:N 用于定义一些计算的上限。vis 数组用于标记数字是否已被处理。p 数组用于存储质数。phi 数组用于存储欧拉函数值。sum 数组用于存储某些中间计算结果。

  2. 定义了一些函数:qpow 函数用于快速计算幂取模运算。init 函数用于初始化 phi 数组和 sum 数组。在初始化 phi 数组时,使用了埃氏筛法的思想,同时计算出每个数的欧拉函数值。S2 函数用于计算平方和并取模。S3 函数用于计算立方和并取模。Sn 函数用于计算特定形式的和。如果 x < N ,直接返回预计算的 sum[x] ;否则通过分块计算的方法来求解。calc 函数用于最终的计算,通过迭代和调用前面定义的函数来得到结果。

  3. 在 main 函数中,读取输入的 P 和 n ,调用 init 函数进行初始化,然后调用 calc 函数计算结果并输出。

P3803 【模板】多项式乘法(FFT)

题目描述

P3803 【模板】多项式乘法(FFT) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

运行代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 4e6;
const double PI = acos(-1);

struct complex {
    double x, y;
    complex operator+(const complex& t) const {
        return {x + t.x, y + t.y};
    }
    complex operator-(const complex& t) const {
        return {x - t.x, y - t.y};
    }
    complex operator*(const complex& t) const {
        return {x * t.x - y * t.y, x * t.y + y * t.x};
    }
} A[N], B[N];
int R[N];

// 交换两个复数
void swapComplex(complex& a, complex& b) {
    complex temp = a;
    a = b;
    b = temp;
}

// 快速傅里叶变换
void FFT(complex A[], int n, int op) {
    for (int i = 0; i < n; ++i)
        R[i] = R[i / 2] / 2 + ((i & 1)? n / 2 : 0);

    for (int i = 0; i < n; ++i)
        if (i < R[i])
            swapComplex(A[i], A[R[i]]);

    for (int i = 2; i <= n; i <<= 1) {
        complex w1({cos(2 * PI / i), sin(2 * PI / i) * op});
        for (int j = 0; j < n; j += i) {
            complex wk({1, 0});
            for (int k = j; k < j + i / 2; ++k) {
                complex x = A[k], y = A[k + i / 2] * wk;
                A[k] = x + y;
                A[k + i / 2] = x - y;
                wk = wk * w1;
            }
        }
    }
}

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 0; i <= n; i++) scanf("%lf", &A[i].x);
    for (int i = 0; i <= m; i++) scanf("%lf", &B[i].x);
    for (m = n + m, n = 1; n <= m; n <<= 1);
    FFT(A, n, 1);
    FFT(B, n, 1);
    for (int i = 0; i < n; ++i) A[i] = A[i] * B[i];
    FFT(A, n, -1);
    for (int i = 0; i <= m; ++i) 
        printf("%d ", (int)(A[i].x / n + 0.5));
    return 0;
}

代码思路

FFT 是一种用于快速计算离散傅里叶变换(Discrete Fourier Transform,DFT)的算法。其核心思想是利用分治法,将长度为 n 的 DFT 分解为两个长度为 n/2 的 DFT,从而大大降低计算复杂度。

  1. 首先定义了一个 complex 结构体来表示复数,其中包含实部 x 和虚部 y 。
  2. FFT 函数用于执行快速傅里叶变换。第一步通过计算 R 数组来确定交换元素的位置。然后进行位逆序交换,将输入的复数序列按照特定的顺序重新排列。接下来通过循环,对于每个长度为 i 的子区间进行合并计算。其中 w1 是旋转因子,wk 用于在每个子区间内逐步乘以旋转因子进行计算。
  3. 在 main 函数中,首先读取两个多项式的系数。然后通过扩展长度进行 FFT 计算,将两个多项式在频域相乘,再通过逆 FFT 转换回时域,得到最终的乘积结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决手机按键失灵!全新检测方案了解一下!

手机按键在手机设备中起着至关重要的作用&#xff0c;手机按键用于执行各种操作&#xff0c;如接听电话、挂断电话、调节音量、开关机等&#xff0c;方便用户进行基本操作。在生产过程中视觉检测需要确保按键的尺寸、形状和表面光滑度符合设计要求&#xff0c;以保证按键的正常…

寒武纪提出视觉AI新高度:不再依赖LLM, Cambrian-1模型让世界看见多模态的力量!

论文标题: Cambrian-1: A Fully Open, Vision-Centric Exploration of Multimodal LLMs 作者团队&#xff1a;纽约大学谢赛宁, Yann LeCun等人 导读&#xff1a; 寒武纪1号(Cambrian-1)&#xff0c;一种以视觉为核心设计的多模态大语言模型&#xff08;MLLMs&#xff09;&…

技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定

作者&#xff1a;Rachel Kang 排版&#xff1a;Alan Wang 在当今的应用开发领域&#xff0c;通过利用本机功能来扩展 .NET 应用程序的能力非常宝贵。.NET MAUI 处理程序架构使开发人员能够使用 .NET 代码直接操作本机控件&#xff0c;甚至允许无缝创建跨平台自定义控件。然而&a…

【星闪开发连载】WS63E开发板Windows环境的构建

目录 HiSpark Studio安装 Python环境配置 SDK代码下载 新建工程 海思官方在gitee仓库中提供了一个文档介绍fbb_ws63: fbb_ws63代码仓为支持ws63和ws63e解决方案SDK。技术论坛&#xff1a;https://developer.hisilicon.com/forum/0133146886267870001 - Gitee.comhttps://gi…

WPF 数据模板DataTemplate、控件模板ControlTemplate、Style、ItemsPreseter

一言蔽之&#xff0c;Template就是“外衣”—— ControlTemplate是控件的外衣&#xff0c; DataTemplate是数据的外衣。 DataTemplate 它定义了一个数据对象的可视化结构 DataTemplate常用的地方有3处&#xff0c;分别是&#xff1a; ContentControl的ContentTemplate属性&…

提升体验:UI设计的可用性原则

在中国&#xff0c;每年都有数十万设计专业毕业生涌入市场&#xff0c;但只有少数能够进入顶尖企业。尽管如此&#xff0c;所有设计师都怀揣着成长和提升的愿望。在评价产品的用户体验时&#xff0c;我们可能会依赖直觉来决定设计方案&#xff0c;或者在寻找改善产品体验的切入…

八股总结----计算机网络

0.OSI七层模型 自己的理解&#xff1a;应用层&#xff1a;生成HTTP请求报文-----表示层&#xff1a;将请求报文转换成适合网络传输的数据格式&#xff0c;加密压缩编码等-----会话层&#xff1a;管理两个应用程序之间的会话&#xff0c;包括连接中断等------传输层&#xff1a…

HAProxy 效能飞跃先锋队

目录 一 负载均衡 1.1 四层负载 1.2 七层负载 1.3 四层负载和七层负载的区别 二 Haproxy简介 2.1 概念和内容 2.2 haproxy的基本配置信息 2.2.1 global 配置 2.2.2 proxies 配置 三 Haproxy的算法 3.1 静态算法 3.2 动态算法 3.3 其他算法 四 高级功能及配置 4.…

进程编程及其函数的使用

1. 创建进程 创建进程的核心操作是使用 fork() 系统调用。 1.1 fork() 系统调用 fork() 创建一个新进程&#xff08;子进程&#xff09;&#xff0c;新进程几乎是父进程的完整拷贝。fork() 返回两次&#xff1a; 在父进程中&#xff0c;返回子进程的 PID。在子进程中&#…

Typescript在AI产品中应用越来越广泛

AI产品中的应用 TypeScript 在 AI 产品中的应用逐渐增多&#xff0c;主要得益于其提供的类型安全、面向对象编程和模块化等特性&#xff0c;这些特性使得开发者能够构建可维护、可扩展和高性能的应用程序。 首先&#xff0c;TypeScript 作为 JavaScript 的超集&#xff0c;通…

C++类和对象(2)——取地址运算符重载

一、const成员函数 const放在成员函数参数列表后面进行修饰&#xff0c;那么这个成员函数就是const成员函数&#xff1b;const实际修饰的是成员函数形参中包含的this指针的形参&#xff0c;表明在这个成员函数内部不能对成员进行修改。 例如日期类里面的Print成员函数&#x…

【HarmonyOS NEXT星河版开发学习】综合测试案例-拼夕夕首页

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 该实战案例并没有用到太多的知识点&#xff0c;只不过用到的一些新东西&#xff0c;要多花时间去熟悉手机app的一些页面&#xff0c;对…

【Python】Python单元测试基础

文章目录 01-单元测试基础什么是单元测试常用的文件结构运行单元测试 01-单元测试基础 什么是单元测试常用的文件结构编写第一个单元测试运行单元测试 什么是单元测试 单元测试是指一个自动化的测试&#xff1a; 用来验证一小段代码&#xff08;单元&#xff09;的正确性&#…

【LLM】医疗大语言模型:CareGPT

向AI转型的程序员都关注公众号 机器学习AI算法工程 CareGPT (关怀GPT)是一个医疗大语言模型&#xff0c;同时它集合了数十个公开可用的医疗微调数据集和开放可用的医疗大语言模型&#xff0c;包含LLM的训练、测评、部署等以促进医疗LLM快速发展。 特性&#xff1a; 添加ChatG…

【Datawhale AI 夏令营】动手学大模型应用开发Task1 Baseline 精读

【Datawhale AI 夏令营】动手学大模型应用开发Task1 Baseline 精读 开源大模型文件预览 Baseline 1.导入库 # 导入所需的库 from transformers import AutoTokenizer, AutoModelForCausalLM import torch import streamlit as st2.模型下载 # 源大模型下载 from modelscope…

将电脑打造成私人网盘,支持外网访问之详细操作教程

你想过把自己电脑打造成随时随地访问的网盘吗&#xff1f;就是那种拥有一个属于自己的影音库&#xff0c;不用担心被和谐&#xff0c;随时可以登录访问电脑上的各种文件&#xff0c;相比传统网盘省心又安全。 使用Everything和节点小宝将电脑搭建成私人网盘&#xff0c;可以实现…

嵌入式面经篇三——数据类型

文章目录 前言一、数据类型1、用变量 a 给出下面的定义2、下面的代码输出是什么&#xff0c;为什么&#xff1f;3、写出 float x 与“零值”比较的 if 语句。4、下面代码有什么错误&#xff1f;5、下面代码输出是什么&#xff1f;6、下面代码运行后会是什么现象&#xff1f;7、…

24年日语能力(JLPT)考试报名流程图解

报名方式 搜索JLPT中国教育考试网&#xff0c;在线报名&#xff0c;一般学生党从教育网入口登录&#xff0c;社会人士从公网入口登录 报名时间 N1-N5 8月20日 7:00 - 8月27日14:00 注册时间 8月13日7:00 - 8月27日14:00 报名步骤 阅读报考提示&#xff0c;注册个人信息→…

此处不允许使用 ‘空‘ 类型

说明&#xff1a;受最近看的书《设计模式之美》&#xff08;小争哥&#xff09;的影响&#xff0c;最近编码有意将一些业务逻辑写在对象里面&#xff0c;增强封装性。在此记录一次项目启动时的报错&#xff0c;如下&#xff1a; 原因&#xff1a;当你在实体类对象中&#xff0c…

UniApp开发的开源工厂设备管理维护系统

本文来自&#xff1a;UniApp开发的开源工厂设备管理维护系统 - 源码1688 前端小程序演示地址&#xff1a; 后台测试网址&#xff1a; https://shebeiguanli.azheteng.cn/pyswkAWtig.php/addon?refaddtabs 测试账户&#xff1a; admin 测试密码&#xff1a; admin888 前端…