LiberOJ #124. 除数函数求和 【整除分块】
一、题目
二、分析
比较好的一题,首先我们要对题目和样例进行分析,明白题目的意思。
由于对于每一个$d$,它所能整除的数其实都是定的,且数量是$ \lfloor \frac{n}{d} \rfloor $ 最终推导出这个公式 $$ ans = \sum_{d=1}^{n} \lfloor \frac{n}{d} \rfloor d^{k}$$
对于$n <= 10^{7}$其实复杂度是可以接受的。但是对于求$d^{k}$这个复杂度如果直接用快速幂预处理肯定会T。
所以,这里用到了一个比较巧妙的方法,即联系线性求欧拉函数,因为幂次方是可以直接相乘的,所以把每个数相当于拆成了素数的$k$次方,这样我们原先求$n$次的快速幂,现在只需要求$\sqrt{n}$次快速幂,即所有素数求一次。然后线性筛一遍就可以了。
三、AC代码
1 #include <bits/stdc++.h>
2
3 using namespace std;
4 #define ll long long
5 const int mod = 1e9 + 7;
6 const int maxn = 1e7 + 13;
7 int Sum[maxn], Prime[maxn], tot;
8 bool isPrime[maxn];
9 int n, k;
10
11 int Pow(int a, int b)
12 {
13 int ans = 1;
14 while(b)
15 {
16 if(b & 1)
17 {
18 ans = 1ll * ans * a % mod;
19 }
20 b >>= 1;
21 a = 1ll * a * a % mod;
22 }
23 return ans;
24 }
25
26 void init()
27 {
28 tot = 0;
29 memset(isPrime, 0, sizeof(isPrime));
30 isPrime[0] = isPrime[1] = 1;
31 Sum[1] = 1;
32 for(int i = 2; i < maxn; i++)
33 {
34 if(!isPrime[i])
35 {
36 Prime[tot++] = i;
37 Sum[i] = Pow(i, k);
38 }
39 for(int j = 0; j < tot && 1ll * Prime[j] * i < maxn; j++)
40 {
41 isPrime[i * Prime[j]] = 1;
42 Sum[i * Prime[j]] = 1ll * Sum[i] * Sum[Prime[j]] % mod;
43 if(i % Prime[j])
44 break;
45 }
46 }
47 }
48
49 int main()
50 {
51 int ans = 0;
52 cin >> n >> k;
53 init();
54 for(int i = 1; i <= n; i++)
55 {
56 int t = n / i;
57 ans = (ans + 1ll * t * Sum[i] % mod) % mod;
58 }
59 cout << ans << endl;
60 return 0;
61 }
LiberOJ #124. 除数函数求和 【整除分块】的更多相关文章
- P2261 [CQOI2007]余数求和[整除分块]
题目大意 给出正整数 n 和 k 计算 \(G(n, k)=k\ \bmod\ 1 + k\ \bmod\ 2 + k\ \bmod\ 3 + \cdots + k\ \bmod\ n\) 的值 其中 ...
- [CQOI2007] 余数求和 - 整除分块
\(\sum_{i=1}^n\;k\;mod\;i\) Solution \(\sum_{i=1}^n\;k\;mod\;i\\=\sum_{i=1}^n(k-i\lfloor{\frac{k}{i} ...
- LOJ #124. 除数函数求和 1
题目描述 $\sigma_k(n) = \sum_{d | n} d ^ k$ 求 $\sum_{i=1}^n\sigma_k(i)$ 的值对 109 取模的结果. 输入格式 第一行两个正整数 n, ...
- Loj #124. 除数函数求和
链接:https://loj.ac/problem/124 就是筛一下积性函数. #include<bits/stdc++.h> #define ll long long #define ...
- 整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)
上模板题例题: [CQOI2007]余数求和 洛谷 BZOJ 题目大意:求 $\sum^n_{i=1}k\ mod\ i$ 的值. 等等……这题就学了三天C++的都会吧? $1\leq n,k\leq ...
- luogu2261余数求和题解--整除分块
题目链接 https://www.luogu.org/problemnew/show/P2261 分析 显然\(k\) \(mod\) \(i=k-\lfloor {k/i}\rfloor\) \(\ ...
- P2261 [CQOI2007]余数求和 【整除分块】
一.题面 P2261 [CQOI2007]余数求和 二.分析 参考文章:click here 对于整除分块,最重要的是弄清楚怎样求的分得的每个块的范围. 假设$ n = 10 ,k = 5 $ $$ ...
- 2018.07.17 CQOI2017 余数求和(整除分块)
洛谷传送门 bzoj传送门 这道题要用到学习莫比乌斯反演时掌握的整除分块算法,也就是对于一个数n" role="presentation" style="pos ...
- 洛谷 P2261 [CQOI2007]余数求和 ||整除(数论)分块
参考:题解 令f(i)=k%i,[p]表示不大于p的最大整数f(i)=k%i=k-[k/i]*i令q=[k/i]f(i)=k-qi如果k/(i+1)=k/i=qf(i+1)=k-q(i+1)=k-qi ...
随机推荐
- C# Dictionaries
Dictionaries 字典 在C# 里是用接口 IDictionary来实现的,最常用的字典就是Dicrtionary<tkey,tvalue>,键值对的形式,和index,item ...
- c# 类(2)
构造函数 和 析构函数 Constructors and destructors 构造函数是一个特殊的函数,当实例化一个类的时候自动调用这个函数,无返回值(不用定义返回类型)普通函数的定义 publi ...
- springboot(六)Email demo
项目中经常使用邮件发送提醒功能,比如说更新安全机制,发送邮件通知用户等 一.简单邮件发送 导入依赖: <dependency> <groupId>org.springframe ...
- IDEA 安装常用操作一
关于IDEA的下载,破解自行百度 一.安装完成的常用设置 SDK选择.编译版本的选择,单项目选择,全局选择 maven配置,单项目,全局配置 二.IDEA如何安装lombok https://www. ...
- website text select notes menu
website text select notes menu website 文字选择笔记菜单(下划线, 标记, 复制, 分享) 下划线, 标记 https://time.geekbang.org/ ...
- Web Components & HTML5 & template & slot
Web Components & HTML5 & template & slot https://developer.mozilla.org/en-US/docs/Web/HT ...
- element-ui的树型结构图,带有复选框的,没有子项的,横排展示
// 修改树形图样式,如果不含有下箭头的块,要变成行内样式 treeChildInline(){ let hasCaretRight = $("#permission_panel" ...
- Puppeteer: 虚拟键盘
文档 main.js const pptr = require('puppeteer'); const gotoUrl = 'http://127.0.0.1:5500/index.html'; (a ...
- 「NGK每日快讯」12.1日NGK公链第28期官方快讯!
- pycharm + git+gitlab的可视化界面操作
前言: 写这篇博客,主要为了记录一套经过本人实践,并运行通过的操作gitlab流程. 通过以下步骤,可实现最基本的远程服务器(gitlab)和本地工具(pycharm)的,针对两端文件增删改查的及 ...