G

大体思路:题意:给定一个n,让你求Σn/i,i从1->n.

PS:这规律按照常规思维真的好难找

规律如下: 
对于一个值 n / i 的个数有 n / i - n / ( i +1)个 
但是这样暴力的话是O(n),2^32 暴力的话应该也会超,所以还得找找别的地方。于是发现当这个数(n / i)大于 sqrt(n) 时,可以暴力求 n / i,对于小于的用规律求个数再乘以这个数。

  

#include <iostream>
#include <cstdio>
#include <cmath>


using namespace std;

int t;
long long n,ans;

int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    for(int j=1;j<=t;j++)
    {
        ans=0;
        long long i;
        cin>>n;
        for(i=1;i<=sqrt(n);i++)
        {
            ans+=n/i;
            if(n/i>n/(i+1)) ans+=(n/i-n/(i+1))*i;

        }
    if (n / (i - 1) == i - 1)//判断重合的时候要减去重复的
        ans -= n / (i - 1);
    printf ("Case %lld: %lld
", j, ans);
    }

    return 0;
}

          

原文地址:https://www.cnblogs.com/Fy1999/p/8926220.html