原来做过的题再看还是没想出来,看来当时必然没有真正理解。这次回顾感觉理解更透彻了。

网上的题解差不多都是一个版本,而且感觉有点扯。根据n=20猜出来的?

好吧哪能根据一个就猜到那么变态的公式。其实这题稍微找下规律就好。当然可能没有公式法效率高,但理解起来更容易吧。

你用n=20的例子,那么我也用。但我的想法是这样的。

sum = 0;

我们考虑 i 是多少时 n/i = 1: 20/1 = 20, 故i <= 20, 又20/2 = 10,  故i > 10, 即 10 < i <= 20 时,n/i = 1; sum += 1*(n/1 - n/2);

同理我们考虑 i 是多少时 n/i = 2: 20/2 = 10, 故i <= 10, 又20/3 = 6, 故i > 6, 即 6 < i <= 10 时,n/i = 2; sum += 2*(n/2 - n/3);

继续我们考虑 i 是多少时 n/i = 3: 20/3 = 6, 故i <= 6, 又20/4 = 5, 故i > 5, 即 5 < i <= 6 时,n/i = 3; sum += 3*(n/3 - n/4);

你们现在找到规律了吗?

需要注意的一点是,越往后n/i就不会按自然数增长了,所以在计算到 (n/i - n/(i+1)) ==  1 时就需要退出这个求解的方式,转而按照正常计算方法 计算 i+1 ~ n的 n/i值;

什么?会超时?事实证明不会哦,因为按之前的算法已经将 i  的范围缩小到logn了,所以之后的循环不会超时的~

/*
Problem: Uva 11526
Tips: 数论, 找规律
Date: 2015.7.27
*/ #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ull; void solve(ull n)
{
ull res = ;
ull i = ;
for(i = ; i <= n; i++)
{
res += i*(n/i - n/(i+));
if(n/i - n/(i+) <= )
break;
}
int st = n/(i+);
for(int i = st; i >= ; i--)
res += n/i; cout << res << endl;
} int main()
{
int T; cin >> T; while(T--)
{
ull n; cin >> n;
solve(n);
}
return ;
}

【数论,找规律】Uva 11526 - H(n)的更多相关文章

  1. UVa 11526 H(n)

    题意: long long H(int n){ long long res = 0; for( int i = 1; i <= n; i=i+1 ){ res = (res + n/i); } ...

  2. uva 11526 H(n) (数论)

    转载自 http://blog.csdn.net/synapse7/article/details/12873437 这道题我自己做的时候没有想到好的优化方法,提交的时候借鉴这篇文章的内容,转载如下: ...

  3. 递推+高精度+找规律 UVA 10254 The Priest Mathematician

    题目传送门 /* 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子 ...

  4. 【数论】UVa 11526 - H(n)

    What is the value this simple C++ function will return? long long H(int n) { ; ; i <= n; i=i+ ) { ...

  5. Codeforces 837E Vasya's Function 数论 找规律

    题意:定义F(a,0) = 0,F(a,b) = 1 + F(a,b - GCD(a,b).给定 x 和 y (<=1e12)求F(x,y). 题解:a=A*GCD(a,b) b=B*GCD(a ...

  6. HDU2608-0 or 1(数论+找规律)

    一,题意: 给定一个n,定义S(n)=T(1)+T(2)+T(3)+...+T(n),T(n)是n的所有因子之和,最后输出S(n)%2的值 (因子就是所有可以整除这个数的数,不包括这个数自身)二,思路 ...

  7. HDU 4861 Couple doubi (数论 or 打表找规律)

    Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...

  8. GCD XOR UVA 12716 找规律 给定一个n,找多少对(a,b)满足1<=b<=a<=n,gcd(a,b)=a^b;

    /** 题目:GCD XOR UVA 12716 链接:https://vjudge.net/problem/UVA-12716 题意:给定一个n,找多少对(a,b)满足1<=b<=a&l ...

  9. 数学--数论--HDU - 6124 Euler theorem (打表找规律)

    HazelFan is given two positive integers a,b, and he wants to calculate amodb. But now he forgets the ...

随机推荐

  1. HDU 5806 NanoApe Loves Sequence Ⅱ (模拟)

    NanoApe Loves Sequence Ⅱ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5806 Description NanoApe, t ...

  2. 单片机C语言下LCD多级菜单的一种实现方法

    摘要:     介绍了在C 语言环境下,在LCD 液晶显示屏上实现多级嵌套菜单的一种简便方法,提出了一个结构紧凑.实用的程序模型. 关键词: 液晶显示屏; 多级菜单; 单片机; C 语言; LCD 中 ...

  3. Linux使用locate命令定位文件

    FIND命令 很多Linux用户喜欢使用find命令来查找文件,例如他们通常喜欢这样做: find / -name 'pattern' 确实find的强大功能不仅仅用来查找文件,它能用来定位更加细节的 ...

  4. Local host name unknown: java.net.UnknownHostException:

    在Linux下安装完resin后,每次启动都出现如下错误: [11:06:45.617] {watchdog-} WatchdogProcess[Watchdog[],7] starting Resi ...

  5. 开发WebForm时遇到的问题

    在做一个小项目时,一个很长的页面,页面底部有一个contact us form 整个页面我没有使用MVC,而是使用ASP.NET WebForm(.aspx)来实现,实现功能后发现,当用户在页面底部输 ...

  6. hdu 4578 Transformation(线段树)

    线段树上的多操作... 题目大意: 树上 的初始值为0,然后有下列三种操作和求和. 1  x y c  在X-Y的之间全部加上C. 2  x y c  在X-Y的之间全部乘上C. 3  x y c   ...

  7. XML操作:2.LINQ TO XML(http://www.cnblogs.com/AlexLiu/archive/2008/10/27/linq.html)

    LINQ to XML 建立,读取,增,删,改   LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除.LINQ可以使的生成的XML文档在 ...

  8. Elasticsearch和mysql数据同步(elasticsearch-jdbc)

    1.介绍 对mysql.oracle等数据库数据进行同步到ES有三种做法:一个是通过elasticsearch提供的API进行增删改查,一个就是通过中间件进行数据全量.增量的数据同步,另一个是通过收集 ...

  9. MySQL安装详解(V5.5 For Windows)

    前言 这几年一直在用MySQL,并且是Windows+.Net+MySQL的搭配,用MyISAM引擎支持过单表每天千万以上的数据递增,TB级的数据MySQL游刃有余.最近在做一个较大并发的项目,尝试了 ...

  10. delphi TreeView修改选中的节点的颜色和背景

      TreeView修改选中的节点的颜色和背景     TCustomDrawTarget = (dtControl, dtItem, dtSubItem);   TCustomDrawStage = ...