CodeForces
来源:互联网 发布:大数据信息安全案例 编辑:程序博客网 时间:2024/06/05 02:40
易水人去,明月如霜。
Calculate the value of the sum: n mod 1 + nmod 2 + n mod 3 + ... + n mod m. As the result can be very large, you should print the value modulo109 + 7 (the remainder when divided by109 + 7).
The modulo operator a mod b stands for the remainder after dividinga by b. For example10 mod 3 = 1.
The only line contains two integers n, m (1 ≤ n, m ≤ 1013) — the parameters of the sum.
Print integer s — the value of the required sum modulo109 + 7.
3 4
4
4 4
1
1 1
0
输入n,m(1<=n,m<=10^13),求n%1+n%2+n%3+……+n%m,数据结果较大,对10^9+7取余
n%i ==> n-[n/i]*i
原式化为n*m - ∑i=1m[n/i]∗i
思路1:l=n/(i+1)+1, r=n/i ==> n/x(l<=x<=r)的值必定等于i
举个例子n=20,m=20,现将n开根号了
i=1 ==> l=11, r=20
i=2 ==> l=7, r=10
i=3 ==>. l=r=6
i=4 ==> l=r=5
那么还应该求n%1*1,n%2*2,n%3*3,n%4*4
所以代码中的las就是标记还剩下几个没有取余
代码:#include <iostream>#include <cstdio>#include <cmath>using namespace std;#define ll __int64const ll MOD=1e9+7;int main(){ ll n,m; scanf("%lld%lld",&n,&m); ll ans=(n%MOD)*(m%MOD)%MOD; ll temp=0,las=m+1; m=min(n,m); ll nn=(ll)sqrt(n*1.0); for (ll i=1;i<=nn;i++) { ll l = n/(i+1)+1; ll r = n/i; r=min(r,m); if (l>r) continue; las=min(las,l); ll s1=l+r , s2 =(r-l+1); if (s1%2==0) s1/=2; else s2/=2; s1%=MOD;s2%=MOD; s1=(s1*s2)%MOD; s1=s1*i%MOD; temp=(temp+s1)%MOD; } ans=(ans+MOD-temp)%MOD; for (ll i=1;i<las;i++) { temp=n/i%MOD*i%MOD; ans=(ans+MOD-temp)%MOD; } printf("%lld\n",ans); return 0;}
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Centos6.7 Centos7.0 安装OpenVSwitch痛苦经历
- C++中空类占一字节原因详解
- Huffman 统计词频(C#)
- Java实现MD5加密(二)
- OS进程调度 HIT
- CodeForces
- HDU 5236 Article(概率DP+贪心 待解决)
- windows下redis 开机自启动
- CentOS7安装Openvswitch 2.3.1 LTS
- Servlet3.1下@MultipartConfig注解方式上传文件
- 先来先服务算法实现(c语言)
- 分布式部署介绍
- 在CentOS7上配置Open vSwitch和VXLAN
- 自定义 React Native 二维码扫描组件(简单,易用!)