题目: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;
}