UVA 1363 - Joseph's Problem(整除分块)

题目链接 https://cn.vjudge.net/problem/UVA-1363

【题意】
输入正整数n,k(1<=n,k<=109) 计算

i=1nk mod i

【思路】
n>k时,余数始终为k
n<=k时,设

p=ki,k mod i=kpi
如果有
ki+1=p,k mod (i+1)=kp(i+1)=kpip=k mod ip
说明只要 k 除以 i 的整数部分相同,那么 k mod i 就会形成一个等差数列,用一次求和公式即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n,k;

int main(){
    while(scanf("%lld%lld",&n,&k)==2){
        ll ans=0;
        if(n>k){
            for(ll L=1,R;L<=k;L=R+1){
                R=k/(k/L);
                ans+=(k%L+k%R)*(R-L+1)/2LL;
            }
            ans+=(n-k)*k;
        }
        else{
            for(ll L=1,R;L<=n;L=R+1){
                R=k/(k/L);
                if(R<=n) ans+=(k%L+k%R)*(R-L+1)/2LL;
                else ans+=(k%L+k%n)*(n-L+1)/2LL;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
posted @ 2018-08-28 19:23  不想吃WA的咸鱼  阅读(111)  评论(0编辑  收藏  举报