51nod 1225 余数之和 数论
2016-04-04 14:30
309 查看
1225 余数之和
题目连接:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1225Description
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的结果即可。
Input
输入1个数N(2 <= N <= 10^12)。Output
输出F(n) Mod 1000000007的结果Sample Input
6Sample Output
3Hint
题意
题解:
余数 = n - n/i*i很显然n/i只会有n的因子个数那么多
而且n/i在连续的一段区间内都是一样的。
这个用一个等差序列去维护i就好了
然后就可以在sqrtn的复杂度解决这道题了。
代码
#include<bits/stdc++.h> using namespace std; const int mod = 1e9+7; long long quickpow(long long m,long long n,long long k)//返回m^n%k { long long b = 1; while (n > 0) { if (n & 1) b = (b*m)%k; n = n >> 1 ; m = (m*m)%k; } return b; } long long mul(long long a,long long b) { if(a>=mod)a%=mod; if(b>=mod)b%=mod; a=a*b; if(a>=mod)a%=mod; return a; } int main() { long long n; cin>>n; long long ans=0; for(int i=1;i<=sqrt(n);i++) { if(n/i==i) { long long temp=n/i*i; ans=(ans+n-temp+mod)%mod; continue; } long long r=n/i; long long l=n/(i+1)+1; long long num=mul(mul(mul((r+l),quickpow(2,mod-2,mod)),(r-l+1)),i); //cout<<mul(n,r-l+1)<<" "<<num<<" "<<i<<" "<<r<<" "<<l<<endl; ans=(ans+mul(n,r-l+1)-num+mod)%mod; ans=(ans+n-mul(n/(n/i),(n/i))+mod)%mod; } cout<<ans<<endl; }
相关文章推荐
- CSS3制作hover下划线动画
- 面试题6 重建二叉树
- IOS-二维码
- C#中的继承举例
- 继承
- Bug的诞生
- 面向对象
- ABP源码分析二十一:Feature
- LeetCode-20.Valid Parentheses
- 三五法则以及行为像值的类和行为像指针的类
- XHTML结构化
- 商业研究(9):入口思维(刚需、频次、免费、变现)
- 商业研究(9):入口思维(刚需、频次、免费、变现)
- 商业研究(9):入口思维(刚需、频次、免费、变现)
- Arduino & Matlab
- 自定义View——坑、技巧、调优
- 74. Search a 2D Matrix
- echars 图表展示
- 慕司板资源汇总
- 101. Symmetric Tree