题目链接:

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. Java中子类覆盖父类方法所必须满足的条件

    因为太喜欢,所以转来,侵删! 参考自:http://www.it165.net/pro/html/201504/39284.html 一.描述 子类重写(覆盖)父类的方法必须满足的条件:1.父类中的方 ...

  2. whatwg-fetch

    fetch 是什么 XMLHttpRequest的最新替代技术 fetch优点 接口更简单.简洁,更加语义化 基于promise,更加好的流程化控制,可以不断then把参数传递,外加 async/aw ...

  3. IE10 CSS Hack(顺便聊聊IE11的CSS Hack)

    一.特性检测:@cc_on 我们可以用IE私有的条件编译(conditional compilation)结合条件注释来提供针对ie10的Hack:该脚本里面的IE排除条件注释,以确保IE6-9不承认 ...

  4. centos6.x硬件信息统计脚本

    #!/bin/bash Line='===========' #linux发行版名称 if [[ -f /usr/bin/lsb_release ]]; then OS=$(/usr/bin/lsb_ ...

  5. AngularJS中的动画实现

    AngularJS 动画 AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angular-animate.min.js 库. <script ...

  6. Lucene学习之二:Lucene的总体架构

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623596.html Lucene总的来说是: 一个高效的,可扩展的,全 ...

  7. No.2一步步学习vuejs 实例demo篇

    简单应用Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统: <div id="app"> {{ message }} </d ...

  8. AtomicInteger关键字

    validate 关键字可以保证多线程之间的可见性,但是不能保证原子操作.(需要了解java内存模型jmm) package com.cn.test.thread; public class Vola ...

  9. ECharts显示百分比(小数转百分比)

    后台数据传递给前端是小数格式,例如:0.2248 前端显示要求为:22.48% 方法,设置tooltip.formatter和yAxis.axisLabel.formatter,两个分别是提示语格式化 ...

  10. POJ 2955 Brackets 区间DP 最大括号匹配

    http://blog.csdn.net/libin56842/article/details/9673239 http://www.cnblogs.com/ACMan/archive/2012/08 ...