一、题目

  #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. 除数函数求和 【整除分块】的更多相关文章

  1. P2261 [CQOI2007]余数求和[整除分块]

    题目大意 给出正整数 n 和 k 计算 \(G(n, k)=k\ \bmod\ 1 + k\ \bmod\ 2 + k\ \bmod\ 3 + \cdots + k\ \bmod\ n\) 的值 其中 ...

  2. [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} ...

  3. LOJ #124. 除数函数求和 1

    题目描述 $\sigma_k(n) = \sum_{d | n} d ^ k$​ 求 $\sum_{i=1}^n\sigma_k(i)$ 的值对 109 取模的结果. 输入格式 第一行两个正整数 n, ...

  4. Loj #124. 除数函数求和

    链接:https://loj.ac/problem/124 就是筛一下积性函数. #include<bits/stdc++.h> #define ll long long #define ...

  5. 整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)

    上模板题例题: [CQOI2007]余数求和 洛谷 BZOJ 题目大意:求 $\sum^n_{i=1}k\ mod\ i$ 的值. 等等……这题就学了三天C++的都会吧? $1\leq n,k\leq ...

  6. luogu2261余数求和题解--整除分块

    题目链接 https://www.luogu.org/problemnew/show/P2261 分析 显然\(k\) \(mod\) \(i=k-\lfloor {k/i}\rfloor\) \(\ ...

  7. P2261 [CQOI2007]余数求和 【整除分块】

    一.题面 P2261 [CQOI2007]余数求和 二.分析 参考文章:click here 对于整除分块,最重要的是弄清楚怎样求的分得的每个块的范围. 假设$ n = 10 ,k = 5 $ $$  ...

  8. 2018.07.17 CQOI2017 余数求和(整除分块)

    洛谷传送门 bzoj传送门 这道题要用到学习莫比乌斯反演时掌握的整除分块算法,也就是对于一个数n" role="presentation" style="pos ...

  9. 洛谷 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 ...

随机推荐

  1. C# Dictionaries

    Dictionaries 字典 在C# 里是用接口 IDictionary来实现的,最常用的字典就是Dicrtionary<tkey,tvalue>,键值对的形式,和index,item ...

  2. c# 类(2)

    构造函数 和 析构函数 Constructors and destructors 构造函数是一个特殊的函数,当实例化一个类的时候自动调用这个函数,无返回值(不用定义返回类型)普通函数的定义 publi ...

  3. springboot(六)Email demo

    项目中经常使用邮件发送提醒功能,比如说更新安全机制,发送邮件通知用户等 一.简单邮件发送 导入依赖: <dependency> <groupId>org.springframe ...

  4. IDEA 安装常用操作一

    关于IDEA的下载,破解自行百度 一.安装完成的常用设置 SDK选择.编译版本的选择,单项目选择,全局选择 maven配置,单项目,全局配置 二.IDEA如何安装lombok https://www. ...

  5. website text select notes menu

    website text select notes menu website 文字选择笔记菜单(下划线, 标记, 复制, 分享) 下划线, 标记 https://time.geekbang.org/ ...

  6. Web Components & HTML5 & template & slot

    Web Components & HTML5 & template & slot https://developer.mozilla.org/en-US/docs/Web/HT ...

  7. element-ui的树型结构图,带有复选框的,没有子项的,横排展示

    // 修改树形图样式,如果不含有下箭头的块,要变成行内样式 treeChildInline(){ let hasCaretRight = $("#permission_panel" ...

  8. Puppeteer: 虚拟键盘

    文档 main.js const pptr = require('puppeteer'); const gotoUrl = 'http://127.0.0.1:5500/index.html'; (a ...

  9. 「NGK每日快讯」12.1日NGK公链第28期官方快讯!

  10. pycharm + git+gitlab的可视化界面操作

    前言: 写这篇博​​客,主要为了记录一套经过本人实践,并运行通过的操作gitlab流程. 通过以下步骤,可实现最基本的远程服务器(gitlab)和本地工具(pycharm)的,针对两端文件增删改查的及 ...