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;
}
相关文章
|
3月前
|
BI 测试技术 Windows
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
|
3月前
|
C++
【PTA】​ L1-080 乘法口诀数列​(C++)
【PTA】​ L1-080 乘法口诀数列​(C++)
73 0
【PTA】​ L1-080 乘法口诀数列​(C++)
|
9月前
一个求公约数和公倍数的有趣求法
一个求公约数和公倍数的有趣求法
30 0
|
10月前
|
算法 C++
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
【每周一坑】​正整数分解质因数 +【解答】计算100以内质数之和
关于分解质因数:每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。分解质因数只针对合数。
|
算法 C语言 C++
【数论】试除法判断质数,分解质因数,筛质数
将定义进行模拟,若整除了除1与其自身的另外的数,则为质数
96 0
|
机器学习/深度学习 编解码 算法
RSA大作业 实现了 1.加、减、乘、除、移位、幂取模的高精度算法 2.利用快速幂和牛顿迭代法加速取模运算 3.中国剩余定理 4.Miller Rabin检测
RSA大作业 实现了 1.加、减、乘、除、移位、幂取模的高精度算法 2.利用快速幂和牛顿迭代法加速取模运算 3.中国剩余定理 4.Miller Rabin检测
197 0
RSA大作业 实现了 1.加、减、乘、除、移位、幂取模的高精度算法 2.利用快速幂和牛顿迭代法加速取模运算 3.中国剩余定理 4.Miller Rabin检测
|
存储 算法
经典算法之异或运算(无进位相加)
经典算法之异或运算(无进位相加)
283 0
经典算法之异或运算(无进位相加)