题目链接:

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---数论(取模运算规律)的更多相关文章

  1. HDU 1212 大整数的取模运算

    因为这里是MOD最大为100000 所以我将字符串看作5个一组,并记录后面跟了多少个100000 每次取5个数根据其数据进行取模更新 注意过程中 100000*100000会超int #include ...

  2. W - Doom HDU - 5239 线段树 找取模的规律+求一个很大的数的平方对一个数取模的写法 特别的模数==2^63-2^31

    这个题目一开始感觉还是有点难的,这个模数这么大,根本就不知道怎么写,然后去搜了题解,知道了怎么去求当x很大的时候x的平方对一个数取模怎么样不会爆掉. 然后还顺便发现了一个规律就是当一个数更新一定次数之 ...

  3. 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 ...

  4. java 取模运算% 实则取余 简述 例子 应用在数据库分库分表

    java 取模运算%  实则取余 简述 例子 应用在数据库分库分表 取模运算 求模运算与求余运算不同.“模”是“Mod”的音译,模运算多应用于程序编写中. Mod的含义为求余.模运算在数论和程序设计中 ...

  5. poj 3980 取模运算

    取模运算 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10931   Accepted: 6618 Description ...

  6. 二分求幂/快速幂取模运算——root(N,k)

    二分求幂 int getMi(int a,int b) { ; ) { //当二进制位k位为1时,需要累乘a的2^k次方,然后用ans保存 == ) { ans *= a; } a *= a; b / ...

  7. PHP中关于取模运算及符号

    执行程序段<?php  echo 8%(-2) ?>,输出结果是: %为取模运算,以上程序将输出0 $a%$b,其结果的正负取决于$a的符号. echo ((-8)%3);     //将 ...

  8. Divide two numbers,两数相除求商,不能用乘法,除法,取模运算

    问题描述:求商,不能用乘法,除法,取模运算. 算法思路:不能用除法,那只能用减法,但是用减法,超时.可以用位移运算,每次除数左移,相当于2倍. public class DividTwoInteger ...

  9. javascript取模运算是怎么算的?其实是取余数

    问到是否整除,这里记录下取模 比如120分钟是不是整点?120%60 === 0 为整点 javascript取模运算是一个表达式的值除以另一个表达式的值,并返回余数. 取模在js里就是取余数的意思. ...

随机推荐

  1. idea maven install 卡住,无报错排查。

    今天使用idea打包,执行install,看控制台日志,卡主了(意思是日志不继续在控制台输打印了,卡主了,也看不到错误),也没有报错,然后进行排查. 进入dos命令,进入到项目的根目录,使用 运行 m ...

  2. h5空白页面过渡加载

    h5空白页面过渡加载 页面第一部分内容是图片,考虑到手机图片加载慢,想用简单.转化为base64的图片过渡 开始尝试将图片转为灰度图片,结果还是很大. 后来选取重要元素,保存2位的png,尺寸是494 ...

  3. 破解b站极验验证码

    这就是极验验证码,通过拖动滑块移动拼图来验证.我们观察到点击滑块时拼图才会出现,所以我们可以在点击滑块之前截取图像,点击滑块再截取一次图像,将前后两次图像做比较就可以找到图片改动的位置.获得位置后,我 ...

  4. php.ini配置max_execution_time和FPM配置request_terminate_timeout

    PHP限定脚本执行时长的方式有几种,下面说下php.ini中的max_execution_time和php-fpm.conf中的request_terminate_timeout 1. php.ini ...

  5. [转]使用依赖关系注入在 ASP.NET Core 中编写干净代码

    本文转自:http://blog.jobbole.com/101270/ 原文出处: Steve Smith    ASP.NET Core 1.0 是 ASP.NET 的完全重新编写,这个新框架的主 ...

  6. jvm options

    http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#Options Categories of J ...

  7. Java - 生成keystore

    有个需求,说要在生成PDF文件时加上signature.操作PDF容易,用: <dependency> <groupId>com.itextpdf</groupId> ...

  8. 06.密封类 sealed

    sealed   修饰 密封类是不能被继承的. 密封类是可以去继承别的类. namespace _07.密封类 { class Program { static void Main(string[] ...

  9. Web开发:Bootstrap的应用

  10. Java Netty简介

    Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户netty.io(http:// ...