当前位置: 首页 > news >正文

HDU5628 Clarke and math 题解 狄利克雷卷积+快速幂

题目链接:https://acm.hdu.edu.cn/showproblem.php?pid=5628

题目大意:

输入 \(n\)\(k\),对于每个 \(i(1 \le i \le n)\),求

\[f(i) = \sum_{i_1 \mid i} \sum_{i_2 \mid i_1} \sum_{i_3 \mid i_2} \cdots \sum_{i_k \mid i_{k-1}} f_{i_k} \]

答案对 \(10^9 + 7\) 取模。


解题思路:

数论函数 \(f(n)\)\(g(n)\) 的 狄利克雷卷积 \(f \ast g\) 定义为

\[(f \ast g)(n) = \sum_{d \mid n} f(d) g(\frac{n}{d}) = \sum_{de = n} f(d) g(e) \]

定义一个单位函数 \(I(n) = 1\)。有

\[f(i) = \sum_{i_1 \mid i} \sum_{i_2 \mid i_1} \sum_{i_3 \mid i_2} \cdots \sum_{i_{k-1} \mid i_{k-2}} \left( \sum_{i_k \mid i_{k-1}} f_{i_k} I(\frac{i_{k-1}}{i_k}) \right) \]

\[= \sum_{i_1 \mid i} \sum_{i_2 \mid i_1} \sum_{i_3 \mid i_2} \cdots \sum_{i_{k-1} \mid i_{k-2}} (f \ast I)(i_{k-1}) \]

\[= \sum_{i_1 \mid i} \sum_{i_2 \mid i_1} \sum_{i_3 \mid i_2} \cdots \sum_{i_{k-3} \mid i_{k-2}} \sum_{i_{k-1} \mid i_{k-2}} (f \ast I)(i_{k-1}) \]

\[= \sum_{i_1 \mid i} \sum_{i_2 \mid i_1} \sum_{i_3 \mid i_2} \cdots \sum_{i_{k-3} \mid i_{k-2}} \left( \sum_{i_{k-1} \mid i_{k-2}} (f \ast I)(i_{k-1}) I(\frac{i_{k-2}}{i_{k-1}}) \right) \]

\[= \sum_{i_1 \mid i} \sum_{i_2 \mid i_1} \sum_{i_3 \mid i_2} \cdots \sum_{i_{k-3} \mid i_{k-2}} \left( \sum_{i_{k-1} \mid i_{k-2}} (f \ast I \ast I)(i_{k-2}) \right) \]

\[= ... \]

\[= (f \ast I \ast \cdot \ast I)(i) \]

\[= (f \ast I^k)(i) \]

其中,\(I^k\) 表示 \(k\)\(I\) 做狄利克雷卷积的结果。\(\rightarrow\) 我们可以用 快速幂 的方式优化这个卷积。

然后再拿 \(f\)\(I^k\) 做一次卷积就可以了。

示例程序:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const long long mod = 1e9 + 7;int T, n, k;vector<ll> dc(vector<ll> a, vector<ll> b, int n) {vector<ll> c(n+1, 0);for (int i = 1; i <= n; i++) {for (int j = 1; i * j <= n; j++) {(c[i * j] += a[i] * b[j]) %= mod;}}return c;
}vector<ll> dpow(vector<ll> a, int b, int n) {vector<ll> res(n+1, 0);res[1] = 1;for (; b; b >>= 1, a = dc(a, a, n)) {if (b & 1)res = dc(res, a, n);}return res;
}int main() {scanf("%d", &T);while (T--) {scanf("%d%d", &n, &k);vector<ll> f(n+1, 0);for (int i = 1; i <= n; i++)scanf("%lld", &f[i]);vector<ll> I(n+1, 1);I[0] = 0;f = dc(f, dpow(I, k, n), n);for (int i = 1; i <= n; i++) {if (i > 1) putchar(' ');printf("%lld", f[i]);}putchar('\n');}return 0;
}
http://www.jsqmd.com/news/838929/

相关文章:

  • 告别网盘下载烦恼:LinkSwift跨平台直链解析工具完全指南
  • 怎样轻松安装ModTheSpire:3个秘诀让你快速上手杀戮尖塔模组管理
  • Ubuntu下CLion从安装到调优:告别卡顿与配置难题
  • Hive 3.1.2 避坑指南:手把手解决‘Metastore未初始化’及分区表数据导入那些事儿
  • 使用Taotoken为Claude Code配置稳定API解决封号困扰
  • 你的Mac存储空间去哪了?Pearcleaner帮你找回丢失的GB
  • ART-Pi软件模拟I2C驱动MPU6050:RT-Thread下的灵活通信方案
  • 拯救论文AI检测标红!2026实测5款降重平台,注入“真实感”的手改全攻略
  • 2026年学术期刊代理行业AI搜索优化服务商选型分析与优质机构推荐 - 产业观察网
  • 收藏!小白程序员必看:读懂AI岗位JD,精准投递不陪跑
  • 终极指南:在Windows上直接安装安卓APK的3大优势与6个实用技巧
  • 如何快速解决AKShare股票数据获取失败的5大实用技巧
  • 英雄联盟内存换肤神器:R3nzSkin全攻略
  • 学Simulink--基于自抗扰控制(ADRC)的电动汽车电机抗负载扰动仿真
  • 3分钟免费安装OBS背景移除插件:无需绿幕的AI虚拟背景终极指南
  • RIS辅助无人机通信的能效优化与深度强化学习应用
  • 国产车载RISC-V AI MCU技术解析:从架构创新到生态构建
  • Windows逆向工程实战:揭秘微信QQ消息防撤回的核心技术与实现
  • Shell 相关基础入门,在 Ubuntu 与 CentOS Shell 中的语法差异总结(bash、dash、sh)
  • 从GMM到MDN:想给神经网络加上‘概率思维’?这份融合指南请收好
  • 【文学研究者的AI分身已上线】:NotebookLM定制知识图谱构建指南——仅限高校人文实验室内部流通的8项参数配置
  • 汇顶科技入围GSA奖项:中国芯片设计公司的全球化突破与启示
  • Postman便携版:打造零污染的API测试工作环境终极指南
  • 用YOLOv7训练课堂行为数据集SCB-Dataset3-S:从数据准备到模型对比的保姆级教程
  • CoPawLauncher:本地AI模型启动器的图形化配置与高效管理
  • vLLM 实战总结:架构演进、常见陷阱与未来展望
  • Windows 11系统优化终极指南:免费提升性能与隐私保护的完整方案
  • 当AI开始检测自身缺陷:测试工具失控的风险与应对
  • Qt + OpenGL实战:手把手教你打造一个可交互的3D点云数据查看器(附CSV加载)
  • VCF 9.1 SSO配置按钮置灰?身份代理重置实操踩坑记