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;
}
相关文章
|
6月前
|
人工智能 网络协议 BI
PTA-求10个整数中的偶数的和
求10个整数中的偶数的和
47 0
|
机器学习/深度学习 算法
【Leetcode】面试题 16.05. 阶乘尾数、HJ7 取近似值
目录 面试题 16.05. 阶乘尾数 HJ7 取近似值
69 0
|
6月前
|
C++
【PTA】​ L1-080 乘法口诀数列​(C++)
【PTA】​ L1-080 乘法口诀数列​(C++)
97 0
【PTA】​ L1-080 乘法口诀数列​(C++)
|
6月前
[leetcode 数位运算] 2939. 最大异或乘积 M
[leetcode 数位运算] 2939. 最大异或乘积 M
|
容器
华为机试HJ60:查找组成一个偶数最接近的两个素数
华为机试HJ60:查找组成一个偶数最接近的两个素数
|
算法 C++
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
|
算法 C++
剑指offer(C++)-JZ15:二进制中1的个数(算法-位运算)
剑指offer(C++)-JZ15:二进制中1的个数(算法-位运算)
|
算法 C语言 C++
【数论】最大公约数、约数的个数与约数之和定理
先来科普下什么是约数:当a能被b整除,我们就说b为a的约数,b的倍数为a
118 0
|
机器学习/深度学习 编解码 算法
RSA大作业 实现了 1.加、减、乘、除、移位、幂取模的高精度算法 2.利用快速幂和牛顿迭代法加速取模运算 3.中国剩余定理 4.Miller Rabin检测
RSA大作业 实现了 1.加、减、乘、除、移位、幂取模的高精度算法 2.利用快速幂和牛顿迭代法加速取模运算 3.中国剩余定理 4.Miller Rabin检测
225 0
RSA大作业 实现了 1.加、减、乘、除、移位、幂取模的高精度算法 2.利用快速幂和牛顿迭代法加速取模运算 3.中国剩余定理 4.Miller Rabin检测