【数论,找规律】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 <= 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;
}

时间: 2024-10-12 11:54:38

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

Codeforces 837E Vasya&#39;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,b),那么b-GCD(a,b) = (B-1)*GCD(a,b),如果此时A和B-1依然互质,那么GCD不变下一次还是要执行b-GCD(a,b).那么GCD什么时候才会变化呢?就是说找到一个最小的S,使得(B-S)%T=0其中T是a的任意一个因子.变形得到:B%T=S于是我们知道S=min(B%T).也

uva 11526 H(n) (数论)

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

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

题目传送门 1 /* 2 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 3 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子,2 ^ (n - k) - 1 4 所以f[n] = min (f[k] * 2 + g[n-k]),n<=10000,所要要用高精度,另外打表能看出规律 5 */ 6 /************************************************ 7 * Auth

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) tha

【数论】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

POJ 2800 Joseph’s Problem 数论找规律

Description 求 Input 两个整数n和k(1<=n,k<=1e9) Output 输出 Sample Input 5 3 Sample Output 7 暴力超时,这样就打下表找下余数的规律.输入100,27,一下子就可以看出来,倒着的看,是一段一段的等差序列. 例如100 25 除数 1    2    3    4    5    6    7    8    9     10     11    12   13 14  15  ......25   26........ 商

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

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

一,题意: 给定一个n,定义S(n)=T(1)+T(2)+T(3)+...+T(n),T(n)是n的所有因子之和,最后输出S(n)%2的值 (因子就是所有可以整除这个数的数,不包括这个数自身)二,思路: 凡是"能被完全开方的"或者"被2整除后能完全开方"的数i,它的(T(i)%2)=1;       i = 1, 2,  3,   4,   5,   6,   7,     8,    9,   10;    i*i = 1, 4,  9,  16, 25, 36,