hdu-2620 Ice Rain---数论(取模运算规律)
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2620
题目大意:
给出n和k求:

解题思路:
kmodi=k-i*[k/i] ,所以
=nk-(1*[k/1]+2*[k/2]+...+n*[k/n])
只需求(1*[k/1]+2*[k/2]+...+n*[k/n])
对于前sqrt(k)项,可以直接求解
对于后面的,可以枚举[k/i]取整得到的值来计算有多少个这样的值。
这样时间复杂度只有根号k
比如k = n = 25,需要求解(1*[k/1]+2*[k/2]+...+n*[k/n])
对于前5项,直接求解
6到25项的结果分别是:
| i | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| [k/i] | 4 | 3 | 3 | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
从6开始
[k/i] = 4 左区间:6 右区间为25 / 4 = 6
[k/i] = 3 左区间:7 右区间为25 / 3 = 8
[k/i] = 2 左区间:9 右区间为25 / 2 = 12
[k/i] = 1 左区间:13 右区间为25 / 1 = 25
可写出伪代码:
i从sqrt(k)+1到k
左区间 l = i;
取整的值x为 k / l
右区间为 r = k / x
右区间取n和右区间的较小值
取整的值x的个数:num = (r - l + 1) * (r + l) / 2 这是由于求的是(1*[k/1]+2*[k/2]+...+n*[k/n])前面还有系数需要相加
tot += num * x
i = r + 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n, k;
while(cin >> n >> k)
{
ll a = n * k;
if(n > k)n = k;
ll m = sqrt(k + 0.5);
ll tot = ;
if(n > m)
{
for(ll i = ; i <= m; i++)
tot += k / i * i;
for(ll i = m + ; i <= n; )//i就是左区间
{
ll x = k / i;
ll r = k / x; //r是右区间
if(r > n)r = n;
tot += (r + i) * (r - i + ) / * x;
i = r + ;
}
}
else
{
for(ll i = ; i <= n; i++)
tot += k / i * i;
}
ll ans = a - tot;
cout<<ans<<endl;
}
return ;
}
hdu-2620 Ice Rain---数论(取模运算规律)的更多相关文章
- HDU 1212 大整数的取模运算
因为这里是MOD最大为100000 所以我将字符串看作5个一组,并记录后面跟了多少个100000 每次取5个数根据其数据进行取模更新 注意过程中 100000*100000会超int #include ...
- W - Doom HDU - 5239 线段树 找取模的规律+求一个很大的数的平方对一个数取模的写法 特别的模数==2^63-2^31
这个题目一开始感觉还是有点难的,这个模数这么大,根本就不知道怎么写,然后去搜了题解,知道了怎么去求当x很大的时候x的平方对一个数取模怎么样不会爆掉. 然后还顺便发现了一个规律就是当一个数更新一定次数之 ...
- HDU——1395 2^x mod n = 1(取模运算法则)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- java 取模运算% 实则取余 简述 例子 应用在数据库分库分表
java 取模运算% 实则取余 简述 例子 应用在数据库分库分表 取模运算 求模运算与求余运算不同.“模”是“Mod”的音译,模运算多应用于程序编写中. Mod的含义为求余.模运算在数论和程序设计中 ...
- poj 3980 取模运算
取模运算 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10931 Accepted: 6618 Description ...
- 二分求幂/快速幂取模运算——root(N,k)
二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...
- PHP中关于取模运算及符号
执行程序段<?php echo 8%(-2) ?>,输出结果是: %为取模运算,以上程序将输出0 $a%$b,其结果的正负取决于$a的符号. echo ((-8)%3); //将 ...
- Divide two numbers,两数相除求商,不能用乘法,除法,取模运算
问题描述:求商,不能用乘法,除法,取模运算. 算法思路:不能用除法,那只能用减法,但是用减法,超时.可以用位移运算,每次除数左移,相当于2倍. public class DividTwoInteger ...
- javascript取模运算是怎么算的?其实是取余数
问到是否整除,这里记录下取模 比如120分钟是不是整点?120%60 === 0 为整点 javascript取模运算是一个表达式的值除以另一个表达式的值,并返回余数. 取模在js里就是取余数的意思. ...
随机推荐
- PHP多维数据排序(不区分大小字母)
1. PHP中最普通的数组排序方法 sort(); 看个例子: <?php $test = array(); $test[] = 'ABCD'; $test[] = 'aaaa'; $test[ ...
- HTML 三角符号
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【c++】常识易混提示
1. struct 和 class 唯一的区别:默认的成员保护级别和默认的派生保护级别不同(前者为public,后者为private). 2. int *p = new int[23]; de ...
- gihub简单学习 步步操作(简单易学)
一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以 ...
- Freemarker 最简单的例子程序
首先导入包,freemarker.jar 下载地址: freemarker-2.3.18.tar.gz http://cdnetworks-kr-1.dl.sourceforge.net/pro ...
- Java - 深拷贝技巧
先让我描述一下问题:我在某Action(struts2.x)-A中写了一个功能P,以当前用户的某个标识F == 1时需要走这个功能,而且这个功能因某些原因已经侵入到了其他一些method中.顺便一提, ...
- 六、mybatis分页插件集成
本文基于上一篇“集成mybatis”内容 1.添加依赖 <!-- mybatis-pageHelper --> <dependency> <groupId>com. ...
- pyhton基础中的要点一
1.python变量的命名规范: (1)变量必须以数字,字母,下划线的任意组合 (2)变量建议用驼峰标识,或下划线 (3)变量要有可描述性 (4)不能以数字开头 (5)不能用python的关键字 (6 ...
- Python-网络编程(二)
今天继续网络编程的东西 一.网络通讯原理 1.互联网的本质就是一系列的网络协议 我们是在浏览器上输入了一个网址,但是我们都知道,互联网连接的电脑互相通信的是电信号,我们的电脑是怎么将我们输入的网址变成 ...
- table中的td自动换行
总有那么几个时候会觉得,table的td不能自适应换行真坑,凭什么只能用tr来换行,经常数据都是连在一起的呀,你叫我怎么把它拆分放到tr里...... 那能不能用ul和li来替换?可以是可以,不过有时 ...