博客
关于我
2020ICPC 江西省大学生程序设计竞赛A Simple Math Problem 莫比乌斯反演
阅读量:622 次
发布时间:2019-03-14

本文共 1667 字,大约阅读时间需要 5 分钟。

C++预处理脚本优化问题

在本文中,我们将提供一个C++预处理脚本,它用于优化一个数学问题。这一脚本涉及到莫比乌斯函数和筛法,它在处理数论问题时表现出色。

代码解释

1. 包含头文件

#include 
#include

2. 预处理常量

const int N = 2e5 + 10;const int M = 1e6 + 10;const int INF = 0x3f3f3f3f;const double eps = 1e-4;const int MOD = 1e9 + 7;

3. 数据类型定义

typedef long long ll;typedef pair
PII;

4. 全局变量

ll prime[N], mu[N], k;ll F[N], ans[N];int n;bool is_prime[N];

5. 函数定义

a. 计算数字之和函数
ll get_sum(int x) {    ll ans = 0;    while (x) {        ans += x % 10;        x /= 10;    }    return ans;}
b. 初始化函数
void init() {    memset(is_prime, true, sizeof is_prime);    mu[1] = 1;    for (int i = 2; i < N; ++i) {        if (is_prime[i]) {            prime[++k] = i;            mu[i] = -1;            for (int j = 1; j <= k && i * prime[j] < N; ++j) {                is_prime[i * prime[j]] = false;                if (i % prime[j] == 0) {                    break;                } else {                    mu[i * prime[j]] = -mu[i];                }            }        }    }    for (int i = 1; i <= n; ++i) {        F[i] = get_sum(i);    }}
c. 预处理答案函数
void pre_process() {    for (int t = 1; t <= n; ++t) {        ll tmp = 0;        for (int T = t; T <= n; T += t) {            int l = T;            int r = min(n, l + t - 1);            tmp += F[l] * ((n / t) - (l / t) + 1);            ans[l] += tmp * mu[t];            if (r + 1 <= n) {                ans[r + 1] -= tmp * mu[t];            }        }    }    for (int i = 1; i <= n; ++i) {        ans[i] += ans[i-1];    }}

代码主函数

void solve() {    cin >> n;    init();    pre_process();    printf("%lld\n", ans[n]);}

总结

这段代码用于解决一个数论问题,它利用了莫比乌斯函数和筛法预处理了答案。在实际应用中,这种预处理方法可以显著提高程序的效率,使其能够在短时间内处理大量数据。

转载地址:http://uqcoz.baihongyu.com/

你可能感兴趣的文章
python解释器环境问题
查看>>
图像质量评估仿真
查看>>
uni-app快速导入自己需要的插件
查看>>
作为公共组软件工程师如何工作
查看>>
编写xor_shellcode.py
查看>>
Echarts笔记
查看>>
Ubuntu 20.04 Docker 安装并配置
查看>>
Java虚拟机详解(五)------JVM参数(持续更新)
查看>>
在 eclipse 中将 web 项目部署到 tomcat 服务器上
查看>>
iOS关于申请公司开发者账号缴费支付
查看>>
10-3 A1-4在产品表中找出库存数量大于50的产品的信息 (20 分)
查看>>
Ajax学习笔记-错误的处理-7
查看>>
SparkStreaming利用队列生成测试数据源
查看>>
js——BOM操作知多少?
查看>>
划分子网与NAT的区别。。。
查看>>
信号量机制
查看>>
钻石操作符使用升级
查看>>
设置方法区大小与OOM
查看>>
对象的实例化内存布局与访问定位内容
查看>>
React + 导入模块的一个错误
查看>>