A New Function LightOJ - 1098

题目:A New Function  LightOJ – 1098 

题意:首先给你个函数SOD(n)为除了1和本身所有的因子之和,如果则会个数的因子是一样的话只能算一个,比如4的因子就是一个2,然后在给你一个函数CSOD(n)它为SOD(n)从1到n的和,那么我们就会想到一种方法求,就是求(n/i-1)*i,为什么这样呢,你可以参考这里面的这里面的A题 ,因为要减去身,所以要减去1。这么做的结果是O(n)一定会超时的,所以需要优化,那么怎么优化呢,因为n/3~n/2这个范围的数据库出现的次数为1次(已经减去本身),n/4~n/3这个范围的数字出现的次数为两次。。。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
int main()
{
    LL ans, a;
    int T;
    cin>>T;
    int ca= 0;
    while(T--)
    {
        ans = 0;
        cin>>a;
        int m = sqrt(a);
        LL t1, t2 = m+1;;
        for(int i = 2; i <= m; i++)
        {
            t1 = a / i;
            ans += (t1-1)*i;
            if(t1 >= t2)
            {
                ans += (t1-t2+1)*(t1+t2)/2;
//当为2的时候算的是从11到50的值,当i为3的时候算的是从11到33的值。。。
//发没发现34~50之间的数只算了一边。。。。
            }
        }
        printf("Case %d: %lld\n",++ca, ans);
    }
    return 0;
}

 

点赞