| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:请问怎么才能不TLE??请高手帮忙啊In Reply To:Re:请问怎么才能不TLE??请高手帮忙啊 Posted by:einstein17 at 2006-04-26 00:32:55 我是这样做的;
k mod i=k- floor(k/i)*i,
根据这公式,只要找到一个区间[a,b],使在这个区间内floor(k/i)为一个定值,然后用求和公式,就可以求出在[a,b]上的余数之和。
j为当前的floor(k.i),则a=k/(j+1)=1,b=k/j,然后j++,可以a=k/(j+1)=1,b=k/j得出下一个区间。
我想这样做已经很快了,但是还是TLE,在我机上很快就出答案了(几乎为0s),但是为什么还是TLE!
请高手指点。
#include<stdio.h>
__int64 sum_k(__int64 k,__int64 n)
{
__int64 sum;
bool flag;
__int64 a,b,t,i,m;
__int64 j;
j=k/n;
a=k/(j+1)+1;
b=k/j;
if(b>n)b=n;
sum=0;
flag=false;
while(a<b)
{
flag=true;
t=k*(b-a+1)-j*(b+a)*(b-a+1)/2;
sum+=t;
j++;
b=m=a-1;
a=k/(j+1)+1;
}
if(flag)
{
for(i=2;i<=m;i++)
sum+=__int64(k%i);
}
else
{
for(i=1;i<=n;i++)
sum+=k%i;
}
return sum;
}
int main()
{
__int64 n,k;
scanf("%I64d %I64d",&n,&k);
__int64 sum=0;
sum=0;
if(n==1)
sum=0;
else if(k==1)
{
sum=n-1;
}
else
{
if(n>k)
{
sum+=sum_k(k,k);
sum+=k*(n-k);
}
else
sum=sum_k(k,n);
}
printf("%I64d\n",sum);
return 1;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator