除法分块学习——P2261 [CQOI2007]余数求和

独立想出了一道蓝题还是很开心的

但是修锅真的难受

以后一定要多测测极限数据,以及跟暴力对拍,看中间值

强调一点:不开longlong见祖宗

可我写的很奇怪啊 用的是while

有空看看大众是怎么写的

#include<cstdio>
#define int long long

inline int min(int x,int y){return x<y?x:y;}

int n,k,now,ans;

signed main(){
    scanf("%lld%lld",&n,&k);
    if(n>k)ans+=k*(n-k),n=k;
    int l=k+1,r;
    do{
    //  if((k/l)%10000==0)
    //      printf("%I64d %I64d %I64d %I64d\n",now,l,r,k/l);
        now=k/(l-1);
        r=l-1;
        l=k/(now+1)+1;
    //  printf("%I64d %I64d %I64d %I64d\n",now,l,r,k/l);
    //  printf("%d %d\n",l,r);
        if(l<=r){
            if(l<=n)r=min(r,n); 
            if(r<=n)ans+=(r-l+1)*k-(k/l)*(l+r)*(r-l+1)/2;
        }
    }while(l>1);
    printf("%lld\n",ans);
}

猜你喜欢

转载自www.cnblogs.com/Y15BeTa/p/11847282.html
今日推荐