51nod 1225 余数之和 (数论)整除分块

简介: 51nod 1225 余数之和 (数论)整除分块

F(n) = (n % 1) + (n % 2) + (n % 3) + … (n % n)。其中%表示Mod,也就是余数。

例如F(6) = 6 % 1 + 6 % 2 + 6 % 3 + 6 % 4 + 6 % 5 + 6 % 6 = 0 + 0 + 0 + 2 + 1 + 0 = 3。

给出n,计算F(n), 由于结果很大,输出Mod 1000000007的结果即可。

输入

输入1个数N(2 <= N <= 10^12)。

输出

输出F(n) Mod 1000000007的结果。

输入样例

6

输出样例

3


余数 = n - n/i*i


很显然n/i只会有n的因子个数那么多


而且n/i在连续的一段区间内都是一样的。


这个用一个等差序列去维护i就好了


然后就可以在sqrtn的复杂度解决这道题了。


注意爆long long

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
int main() {
  long long n, inv = 500000004;
  cin >> n;
  long long ans = (n % mod) * (n % mod) % mod;
  for (long long i = 1,j; i <= n; i = j + 1) {
    j = n/(n/i);
    ll x = n/i*(j + i)%mod;
    ll y = (j - i + 1)%mod * inv % mod;
    ans -= x * y;
    ans = (ans % mod + mod) % mod;
  }
  cout << ans << endl;
  return 0;
}
相关文章
|
2月前
|
BI 测试技术 Windows
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
|
2月前
|
算法
容斥原理:能被整除的数
容斥原理:能被整除的数
|
2月前
|
算法 测试技术 C#
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
|
2月前
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
28 0
|
8月前
一个求公约数和公倍数的有趣求法
一个求公约数和公倍数的有趣求法
19 0
|
11月前
|
算法 C语言 C++
【数论】最大公约数、约数的个数与约数之和定理
先来科普下什么是约数:当a能被b整除,我们就说b为a的约数,b的倍数为a
85 0
|
11月前
|
算法 C语言 C++
【数论】试除法判断质数,分解质因数,筛质数
将定义进行模拟,若整除了除1与其自身的另外的数,则为质数
82 0
|
算法 C++
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
素数又称为质数,它指在一个大于1的自然数中,除了1和它自身外,没法被其他自然数整除的数。比1大,但不是素数的数称为合数。0和1既不是素数,也不是合数。因为素数的分布没有明显的规律,所以在程序中一般根据素数的定义来判断该数是否为素数。例如哥德巴赫猜想:哥德巴赫通过大量的数据猜测,所有不小于6的偶数,都可以表示为两个奇素数之和。后人将其称之为“1+1”。并且,对于每个不小于9的奇数,都可以表示为三个奇素数之和。
263 0
【基础算法】几种特殊数(素数、公约数、完全数、亲密数) & C++实现
求一个数n次方后的末尾数(数论/快速幂)
hdu1061-Rightmost Digit hdu1097-A hard puzzle 这两个oj题目思路几乎一样,都是为了快速求出一个数n次方后的末尾数为都多少?
193 0
求一个数n次方后的末尾数(数论/快速幂)