博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
阅读量:6001 次
发布时间:2019-06-20

本文共 1318 字,大约阅读时间需要 4 分钟。

1257: [CQOI2007]余数之和sum

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 4474  Solved: 2083
[][][]

Description

给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

Input

输入仅一行,包含两个整数n, k。

Output

输出仅一行,即j(n, k)。

Sample Input

5 3

Sample Output

7

HINT

50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9

Source

题目链接:

分析:用了一个看起来比较奇怪的方法,首先x % i = x – (int)(x / i) * i,这个很好YY吧

然后可以找出每个(int)(x / i)相等的一段用等差数列求和来做。可以证明最多分成sqrt(n)段。

下面给出AC代码:

1 #include 
2 using namespace std; 3 typedef long long ll; 4 inline int read() 5 { 6 int x=0,f=1; 7 char ch=getchar(); 8 while(ch<'0'||ch>'9') 9 {10 if(ch=='-')11 f=-1;12 ch=getchar();13 }14 while(ch>='0'&&ch<='9')15 {16 x=x*10+ch-'0';17 ch=getchar();18 }19 return x*f;20 }21 int n,k;22 ll ans;23 int main()24 {25 n=read();26 k=read();27 if(n>k)28 {29 ans=(ll)(n-k)*k;30 n=k;31 }32 int r;33 for(int i=1;i<=n;i=r+1)34 {35 int t=k/i;36 r=k/t;37 if(r>=n)r=n;38 ans+=(ll)(r-i+1)*k-(ll)(r-i+1)*(i+r)/2*t;39 }40 printf("%lld\n",ans);41 return 0;42 }

 

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/7113561.html

你可能感兴趣的文章
解密 阿里巴巴大数据女程序员瑞清代码诗!
查看>>
阿里云 Aliplayer高级功能介绍(九):自动播放体验 ...
查看>>
05.java多线程问题
查看>>
Centos下编译安装Samba
查看>>
个人安装caffe过程中遇到的问题及解决方案
查看>>
SAP如何查看会计凭证
查看>>
短视频平台开发时那些容易掉进去的“深坑”
查看>>
制造业瓶颈如何突破?“智变与突破——制造业人工智能产业峰会·南京”来献策 ...
查看>>
弹性计算双周刊 第23期
查看>>
阿里云发布2019数字化趋势报告,未来5年零售业数字化程度将达80%
查看>>
阿里云DDoS高防IP防御原理、功能优势及价格收费详解
查看>>
High Level REST Client 访问阿里云6.3 Elasticsearch 实例实现
查看>>
zabbix 添加mysql监控(用自带模板)
查看>>
洛谷 P3819 松江1843路
查看>>
网站架构的逐步优化演变
查看>>
125.53亿元!融创收购泛海北京泛海国际项目及上海董家渡项目
查看>>
Firefox 将添加画中画功能
查看>>
Spring Boot(07)——ConfigurationProperties介绍
查看>>
动力节点Java学习资料为互联网应用文件存储而生之FastDFS
查看>>
go常用辅助工具
查看>>