UVA - 11526 H(n) (数学)

题目链接】:click here~~

题目大意

What is the value this simple C++ function will return?

long long H(int n){

long long res = 0;

for( int i = 1; i <= n; i=i+1 ){

res = (res + n/i);

}

return res;

}

Input

The first line of input is an integer T (T ≤ 1000) that indicates the number of test cases. Each of thenext T line will contain a single signed 32 bit integer n.

Output

For each test case, output will be a single line containing H(n).

Sample Input

2

5

10

Sample Output

10

27

就是求n/1...n/n的值

解题思路】我们改变一下循环里面的长度,很容易想到只要循环到sqrt(n),最后结果乘以2再减去sqrt(n)平方回来的结果就是答案了。

代码:

//uva 11526
#include <bits/stdc++.h>
using namespace std;
long long t,n;
long long solve(int n)//超时
{
    long long res=0;
    for(int i=2; i<n; i++)
    {
        res+=n/i;
    }
    return res;
}
long long W(long long n)
{
    int t=sqrt(n+0.5);
    long long  res = 0;
    for(int i=1;i<=t;i++) res+=n/i;
    return (res<<1)-t*t;
}
long long  H(long long  n)//或者合并结果相同的项,答案是一样的
{
    long long  res = 0;
    long long  L=1,R=0;
    while(L<=n)
    {
        long long  p=n/L;
        R=n/p;
        res+=p*(R-L+1);
        L=R+1;
    }
    return res;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        //printf("%lld\n",solve(n)+n+1);
       // printf("%lld\n",H(n));
        printf("%lld\n",W(n));
    }
    return 0;
}
时间: 2024-10-05 02:01:36

UVA - 11526 H(n) (数学)的相关文章

uva 11526 H(n) (数论)

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

【数论】UVa 11526 - H(n)

What is the value this simple C++ function will return? 1 long long H(int n) 2 3 { 4 long long res = 0; 5 for( int i = 1; i <= n; i=i+1 ) 6 7 { 8 res = (res + n/i); 9 } 10 return res; 11 } Input The first line of input is an integer T (T ≤ 1000) that

UVA 11526 H(n)

https://cn.vjudge.net/problem/UVA-11526 除法分块 #include<cstdio> #include<iostream> using namespace std; typedef long long LL; void read(long long &x) { x=0; char c=getchar(); int f=1; while(!isdigit(c)) { if(c=='-') f=-1; c=getchar();} while

【数论,找规律】Uva 11526 - H(n)

原来做过的题再看还是没想出来,看来当时必然没有真正理解.这次回顾感觉理解更透彻了. 网上的题解差不多都是一个版本,而且感觉有点扯.根据n=20猜出来的? 好吧哪能根据一个就猜到那么变态的公式.其实这题稍微找下规律就好.当然可能没有公式法效率高,但理解起来更容易吧. 你用n=20的例子,那么我也用.但我的想法是这样的. sum = 0; 我们考虑 i 是多少时 n/i = 1: 20/1 = 20, 故i <= 20, 又20/2 = 10,  故i > 10, 即 10 < i <

UVA - 11526 - H(n)(思路,减少枚举量)

题意:给定在32位带符号整数范围内的n,求n/1+n/2+n/3+n/4+--+n/n = ? 因为损失精度,所以算出来的有些连续的项是相同的数值,故想办法找出对于某个值,哪一段范围均是这个值. 详见代码注释 #include<cstdio> #include<cstring> #include<cctype> #include<cstdlib> #include<cmath> #include<iostream> #include&

uva 617- Nonstop Travel(暴力+数学)

题目链接:uva 617 - Nonstop Travel 题目大意:在一条路上有n个红绿灯,给出红绿灯的位置,以及绿灯,黄灯和红灯的时间,问现在以什么样的速度可以不同停止便通过这条路段.(速度只在30~60km/h) 解题思路:枚举速度,然后判断即可. 注意说黄灯也是可以过的,以及红绿灯的距离是以米为单位的. #include <cstdio> #include <cstring> const int N = 10; struct state { double dis; int

uva 10623 - Thinking Backward(数学)

题目链接:uva 10623 - Thinking Backward 题目大意:就是给出N,表示要将平面分解成N份,问有哪些可选则的方案,m表示椭圆.n表示圆形.p表示三角形的个数,m.n.p分别给定范围. 解题思路:本来这题一点思路都没有,但是在论坛上看到一个公式N=2+2m(m?1)+n(n?1)+4mn+3p(p?1)+6mp+6np 这样只要枚举m和p,求解n,判断n是否满足即可,注意n一定是整数. #include <cstdio> #include <cstring>

uva 11657 - Rational Billiard(数学)

题目链接:uva 11657 - Rational Billiard 题目大意:给定一个边界M,N,以及第一个球和第二个球的位置,第一个球以p,q的方向移动,碰到边界后被反弹,和光线的路线一致,问有没有可能集中第二个球. 解题思路:在网上参考别人的思路,首先将横纵坐标扩大相应倍数,保证p,q每移动一次对应在新平面为单位长度,然后只需要考虑横向移动所需要的步数,减掉纵向移动所需的步数后,剩余的步数是否满足周期的倍数即可.考虑四种请况.这题数据非常水,一开始坐标写错也过了. #include <cs

UVA 10668 - Expanding Rods(数学+二分)

UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图可以很容易推出公式,设圆弧扇形部弧度r,那么可以计算出铁棒长度为lr/sin(r)这个公式在[0, pi/2]是单调递增的,所以可以用二分法去求解 要注意的一点是最后答案计算过程中带入mid,之前是带入x(二分的左边值),可实际上x是可能等于0的,而带入mid,由于是double型,所以mid实际上表示是一个非常趋近0