码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-27 22:46:03      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

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

网上的题解差不多都是一个版本,而且感觉有点扯。根据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 + 1);

同理我们考虑 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 + 1);

继续我们考虑 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 + 1);

你们现在找到规律了吗?


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;

void solve(ull n)
{
    ull res = 0;
    for(ull i = 1; i <= n; )
    {

        res += i*(n/i - n/(i+1));
        i = n/(i+1);
    }
    cout << res << endl;
}


int main()
{
    int T; scanf("%d", &T);

    while(T--)
    {
        ull n;  scanf("%I64u", &n);

        solve(n);

    }

    return 0;
}

 

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

标签:

原文地址:http://www.cnblogs.com/LLGemini/p/4681336.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!